使用指定的类型创建集合(例如Map) - 不使用通用Object类

时间:2016-04-16 14:55:08

标签: java

是否可以创建具有指定类型的Map而不是通用的Object类对象?

假设我有一个javafx.collections.ObservableMap<java.lang.Integer, java.lang.String>

的Type对象

我得到了地图的子类型:

Class<?> keyClass = Class.forName(objectGenericTypes[0].getTypeName());
Class<?> valueClass = Class.forName(objectGenericTypes[1].getTypeName());

我可以在不使用Integer的情况下使用StringkeyClass个对象中指定的valueClassMap<Object,Object>类创建Map对象吗? (IntegerString可以是任何其他类)

1 个答案:

答案 0 :(得分:3)

由于type erasure

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)。由于泛型类型仅由编译器使用,因此这是安全的:编译后的字节码将在使用类型的位置插入必要的强制转换。