如何在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()”这样的代价?