如何在JAVA中定义使用2个泛型参数扩展Map对象的泛型类型?

如何在JAVA中定义使用2个泛型参数扩展Map对象的泛型类型?,java,generics,map,Java,Generics,Map,这是我的代码: public class Configuration <T extends Map<K,V>, K, V> { public Map<K, V> fields; public Configuration() { this.fields = new T<K, V>(); // --> error: Type 'T' does not have type parameters } } 公

这是我的代码:

public class Configuration <T extends Map<K,V>, K, V> {
    public Map<K, V> fields;

    public Configuration() {
        this.fields = new T<K, V>(); // --> error: Type 'T' does not have type parameters
    }
}
公共类配置{
公共地图领域;
公共配置(){
this.fields=new T();//-->错误:类型“T”没有类型参数
}
}

为什么我不能用泛型参数定义泛型对象?

因为泛型是如何在Java中设计的(泛型信息仅在编译时使用),所以永远不能执行
new t()
,其中
t
是一个类型参数

一种可能的替代方法是这样做:

public interface ConfigurationMapFactory<K, V> {
    public Map<K, V> createMap();
}

public class Configuration <K, V> {
    public Map<K, V> fields;

    public Configuration(ConfigurationMapFactory<K, V> mapFactory) {
        this.fields = mapFactory.createMap();
    }
}
公共接口配置映射工厂{
公共地图createMap();
}
公共类配置{
公共地图领域;
公共配置(ConfigurationMapFactory mapFactory){
this.fields=mapFactory.createMap();
}
}
虽然在这种情况下,你可以很容易地做到这一点-有没有理由这将不起作用

public class Configuration <K, V> {
    public Map<K, V> fields;

    public Configuration(Map<K, V> fields) {
        this.fields = fields;
    }
}
公共类配置{
公共地图领域;
公共配置(映射字段){
this.fields=字段;
}
}

由于泛型是如何在Java中设计的(泛型信息仅在编译时使用),因此永远不能执行
new T()
,其中
T
是一个类型参数

一种可能的替代方法是这样做:

public interface ConfigurationMapFactory<K, V> {
    public Map<K, V> createMap();
}

public class Configuration <K, V> {
    public Map<K, V> fields;

    public Configuration(ConfigurationMapFactory<K, V> mapFactory) {
        this.fields = mapFactory.createMap();
    }
}
公共接口配置映射工厂{
公共地图createMap();
}
公共类配置{
公共地图领域;
公共配置(ConfigurationMapFactory mapFactory){
this.fields=mapFactory.createMap();
}
}
虽然在这种情况下,你也可以很容易做到这一点——这有没有理由不起作用

public class Configuration <K, V> {
    public Map<K, V> fields;

    public Configuration(Map<K, V> fields) {
        this.fields = fields;
    }
}
公共类配置{
公共地图领域;
公共配置(映射字段){
this.fields=字段;
}
}

除了“您永远不能执行
new T()
其中
T
是一个变量”这句话之外,您无法知道(编译器也是如此!)类型是否定义了该构造函数。假设运行时
T
A
类型,可能只定义了构造函数
A(String str)
,然后
new T()
将无效。在某些其他语言(C++)中
new T()
将有效,除非您实际尝试创建
配置。但是我怀疑这更容易出错。好吧,你的answare很清楚,但是没有像“where t:new()”?除了这句话之外,你永远不能做
new t()
其中
t
是一个变量-你不知道(编译器也不知道!)类型是否定义了该构造函数。假设运行时
T
A
类型,可能只定义了构造函数
A(String str)
,然后
new T()
将无效。在某些其他语言(C++)中
new T()
将有效,除非您实际尝试创建
配置。但是我怀疑这更容易出错。好吧,你的answare很清楚,但是没有像“where t:new()”这样的代价?