Java 将泛型类参数限制为实现映射的类
我正在尝试编写一个Java 将泛型类参数限制为实现映射的类,java,generics,Java,Generics,我正在尝试编写一个地图生成器。其中一个构造函数将允许客户机指定他们希望构建的Map的类型 public class MapBuilder<K, V> { private Map<K, V> map; /** * Create a Map builder * @param mapType the type of Map to build. This type must support a default constructor
地图生成器。其中一个构造函数将允许客户机指定他们希望构建的Map
的类型
public class MapBuilder<K, V> {
private Map<K, V> map;
/**
* Create a Map builder
* @param mapType the type of Map to build. This type must support a default constructor
* @throws Exception
*/
public MapBuilder(Class<? extends Map<K, V>> mapType) throws Exception {
map = mapType.newInstance();
}
// remaining implementation omitted
}
公共类映射生成器{
私人地图;
/**
*创建地图生成器
*@param mapType要生成的映射类型。此类型必须支持默认构造函数
*@抛出异常
*/
公共地图生成器(类以下将起作用:
public MapBuilder(Class<? extends Map> mapType) throws Exception {
map = mapType.newInstance();
}
publicmappbuilder(Class以下功能将起作用:
public MapBuilder(Class<? extends Map> mapType) throws Exception {
map = mapType.newInstance();
}
公共地图生成器(类使用供应商
而不是类
:
public MapBuilder(Supplier<? extends Map<K, V>> supplier) {
map = supplier.get();
}
公共地图生成器(供应商使用供应商
而不是类
:
public MapBuilder(Supplier<? extends Map<K, V>> supplier) {
map = supplier.get();
}
publicmappbuilder(供应商问题在于LinkedHashMap.class
是
Class<LinkedHashMap>
问题是LinkedHashMap.class
是
Class<LinkedHashMap>
为什么不使用供应商
?这样,用户可以通过LinkedHashMap::new
而不必担心反射。为什么不使用供应商
呢?这样,用户可以通过LinkedHashMap::new
而不必担心反射。将产生未经检查的警告,但将产生未经检查的警告警告您可以完全取消通配符:publicmappbuilder(Supplier)
@ernest\k您不能。没有通配符,如果您提供一个实例,例如class Sup implements Supplier
,它将失败。这是一种非常罕见的情况,但它可能会发生。即使您使用lambda,它仍然会失败(Supplier supp=HashMap::new;MapBuilder mb=new MapBuilder(supp);
-但这是我个人很高兴没有支持的东西(这是一个观点)。顺便说一句,这是一个很好的答案。@ernest_k谢谢:),我同意,尽管在一个小项目中它不会有什么不同(使用通配符或不使用通配符)但是,当编写一个跨不同项目使用的API时,这是一种可行的方法,它使使用API的人的生活更加轻松。您可以完全摆脱通配符:publicmappbuilder(供应商)
@ernest_k您不能。如果没有通配符,那么如果您提供了一个实例,例如类Sup implements Supplier
,它将失败。这是一种非常罕见的情况,但它可能会发生。即使您使用lambda(Supplier supp=HashMap::new;MapBuilder mb=new MapBuilder(Supplier))
-但我个人很高兴没有人支持这一点(这是一种观点)。顺便说一句,这是一个很好的答案。@ernest_k谢谢:),我同意,尽管在一个小项目中,它不会有什么不同(使用通配符或不使用通配符)但是,当编写一个跨不同项目使用的API时,这是一种可行的方法,它使使用您的API的人的生活变得更加轻松
Class<LinkedHashMap<Integer, String>>
public MapBuilder(Class<? extends Map> mapType) throws Exception
mapType.getConstructor().newInstance()