是否可以创建具有指定类型的Map而不是通用的Object类对象?
假设我有一个javafx.collections.ObservableMap<java.lang.Integer, java.lang.String>
我得到了地图的子类型:
Class<?> keyClass = Class.forName(objectGenericTypes[0].getTypeName());
Class<?> valueClass = Class.forName(objectGenericTypes[1].getTypeName());
我可以在不使用Integer
的情况下使用String
和keyClass
个对象中指定的valueClass
和Map<Object,Object>
类创建Map对象吗? (Integer
和String
可以是任何其他类)
答案 0 :(得分:3)
Java中的类型参数未实现。 (这有一个例外:如果你创建一个泛型类型的具体子类,那么父类的类型参数被“硬编码”到子类中,并且可以使用反射找到。这种技术称为{{3} }。)
在创建类似new HashMap<String, Integer>
的类型的常见情况下,运行时类型中没有任何内容指示类型参数。而是将类型参数作为强制转换插入到使用相应值的位置。
如果要创建具有相同类型参数的新地图,则需要在通用签名中捕获它们:
public static <K, V> Map<K, V> newMapWithParametersOf(Map<K, V> map) {
return new HashMap<>();
}
在引擎盖下,这里返回的对象实际上仍然是 一个HashMap<Object, Object>
(或者更准确地说,是一个没有任何类型参数的原始HashMap
)。由于泛型类型仅由编译器使用,因此这是安全的:编译后的字节码将在使用类型的位置插入必要的强制转换。