我有一个返回类型的泛型方法。我知道它几乎没有任何实际用途,具有原始数据类型的泛型,但我正在进行实验。我无法理解,当一个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
}
}
答案 0 :(得分:2)
由于类型删除,除非您从E
传入Foo<E>
,Class<E>
或E.class
,否则您永远不会知道E的类型。类型是在这种情况下,在运行时不可用。
演员也可能变得非法,但我们甚至无法做到那么远。
传入一个盒装的Integer会给出一个可反复的参数,所以你知道类型必须是Integer,因此返回了盒装的整数。
对Demo
类进行泛化,使E可以反复,或者确定传递E是(可反复)的内容,例如Foo<E>
,Class<E>
是填充E.class
或E
本身的示例。