【问题标题】:Generic method with return type <E>返回类型 <E> 的泛型方法
【发布时间】:2013-08-29 20:11:43
【问题描述】:

我有一个返回类型的泛型方法。我知道它几乎没有任何实际用途,具有原始数据类型的泛型,但我正在试验。我无法理解,当 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
 }
}

【问题讨论】:

  • 你会如何关联Eint
  • @Rohit 就像我将 List 类型的列表投射到 List 一样,我可以投射它吗?
  • Downvoters,这是一个新手提出的真正问题。谢谢 :)
  • 如果你注意到,编译器会在列表中给你一个未经检查的强制转换警告。这是因为由于类型擦除,List&lt;E&gt;List&lt;Demo&gt; 在运行时都是 List

标签: java generics


【解决方案1】:

由于类型擦除,你永远不会知道 E 的类型,除非你从传入的E.class 获得EFoo&lt;E&gt;Class&lt;E&gt;。在这种情况下,该类型在运行时不可用。

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

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

要么对Demo 类进行泛化以使 E 是可重定义的,要么确保传入说明 E 是什么(可重定义)的内容,例如 Foo&lt;E&gt;Class&lt;E&gt; 填充有 E.classE 本身的一个例子。

【讨论】:

    猜你喜欢
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 2015-07-18
    相关资源
    最近更新 更多