2

我有一个返回类型的通用方法。我知道它几乎没有任何实际用途,具有原始数据类型的泛型,但我正在试验。我无法理解,当将primitive数据类型传递给它的参数时method 3它正在工作,那么为什么强制转换在method 4

如果它在方法 3 中适用于原始数据类型,那么为什么不在方法 4 中。

class Demo
{
    List<Demo> list = new ArrayList<Demo>();
    int id;
    int b[];

 public <E> List<E> showList()  //Method 1
 {
     return (<E>)list;   //This works fine
 }

 public <E> List <E> showList2(List<E> x) //Method 2
 {
   return x;             // This works fine 
 }

 public <E> E showNumber(E x)  //Method 3,called as new Demo().showNumber(2);
 {
    return x;   //works for every primitive data type
 }

 public <E> E show()    //Method 4
{
   return (E)id;    // Not working
 }
}
4

1 回答 1

2

由于类型擦除,您永远不会知道 E 的类型,除非您 get EFoo<E>Class<E>fromE.class传入。在这种情况下,该类型在运行时不可用。

演员表也可能成为非法,但我们甚至无法做到这一点。

传入一个装箱的 Integer 会给出一个可重复的参数,因此您知道类型必须是 Integer,因此会返回装箱的整数。

要么对Demo类进行泛化,使 E 是可重构的,要么确保传入说明 E 是什么(可重构)的内容,例如Foo<E>Class<E>填充的aE.class或自身的示例E

于 2013-08-29T11:30:29.360 回答