2012-06-25 66 views
0

我有一个参数化的泛型类X,它的类型为T.其上没有定义任何条件(如T extends/implements)。Autoboxing不适用于参数化类型

class X <T> { 
    Map<T, String> map = new HashMap<T, String>(); 

    public void put() { 
     map.put((T)getLong(), ""); 
    } 

    public long getLong() { 
     return 0L; 
    } 
} 

我们知道T肯定是一个对象类型而不是原语。所以我期望返回的“长”值被Autoboxed变长,然后转换到T会跟着,但那不会发生。编译器说“不能长时间投射到T”。编译器说:“不能长时间投射到T”。编译器说:“不能长时间投射到T”。如果我将参数化类型T替换为“长”,则没有问题。 任何人都可以解释为什么Java不支持在涉及参数化类型时对基元类型进行自动装箱?有什么我失踪?

谢谢!

+1

假设以上所有条件都只与T一样有效。对于任何其他参数化,您将得到'ClassCastException'。那么你在那里用泛型来完成什么? –

+0

感谢您的回复。对不起,是的,在这里我们可以假设T和Long是兼容的类型。不是真的担心运行时出现ClassCastException,而是编译时出错。 –

+0

如果你添加了''它可能会工作。 –

回答

2

我认为,首先你应该自动复制然后投射到T.它应该写为如下。

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

因此,当此方法返回时会发生自动装箱。在你的情况下会发生什么,它不会自动复制长时间的基元,而且你试图将这个长的基元投射到T上,你根本无法做到。

+0

请确认它是否适用于你.. – Ahmad

+0

是的,这个工程就像一个魅力。谢谢!想知道,为什么Java会施加这样的限制。 –

+1

@ kryptic ..这不是限制人..只是你期望从Java太多。 – Ahmad

相关问题