自动装箱不适用于参数化类型

时间:2012-06-25 06:38:55

标签: java generics casting autoboxing

我有一个参数化的泛型类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在参与参数化类型时不支持原始类型的自动装箱?有什么我想念的吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

我认为,首先你应该自动装箱,然后再投射到T.它应该写成如下。

public Long getLong() {  //not long, because it's primitive
        return 0L;
    }

因此,此方法返回时会发生自动装箱。在你的情况下会发生什么,它不会自动显示长原语,你试图将这个长原语转换为T.你根本无法做到。