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()