我有一个参数化的泛型类X,它采用类型T.在其上没有定义任何条件(如T extends / implements)。
class X <T> {
Map<T, String> map = new HashMap<T, String>();
public void put() {
map.put((T)getLong(), "");
}
public long getLong() {
return 0L;
}
}
我们知道T绝对是一种对象类型,而不是一种原始类型。所以我希望返回的“long”值被Autoboxed为Long,然后转换为T会跟随,但这不会发生。
编译器说“不能从长时间转换为T”。如果我用“Long”替换参数化类型T,则没有问题。 任何人都可以解释为什么Java在参与参数化类型时不支持原始类型的自动装箱?有什么我想念的吗?
谢谢!
答案 0 :(得分:2)
我认为,首先你应该自动装箱,然后再投射到T.它应该写成如下。
public Long getLong() { //not long, because it's primitive
return 0L;
}
因此,此方法返回时会发生自动装箱。在你的情况下会发生什么,它不会自动显示长原语,你试图将这个长原语转换为T.你根本无法做到。