代码之家  ›  专栏  ›  技术社区  ›  alasdairg

Java泛型-消失类型信息?

  •  2
  • alasdairg  · 技术社区  · 15 年前

    好的,我知道Java泛型可能是一个不谨慎的雷区,但是我遇到了一个非直觉的(无论如何我)的行为,我想知道是否有人能解释:首先,这里是一个编译的类:

    public class Dummy {
    
       public List<? extends Number> getList() {
          return new ArrayList<Number>();
       }
    
       public static void main(String[] args) {
          Dummy dummy = new Dummy();
          for (Number n: dummy.getList()) {
             System.out.println(n);
          }    
       }
    }
    

    简单的东西。现在,我通过向dummy添加类型参数t来进行单个更改:

    public class Dummy<T> {
    

    现在类无法编译,给出了错误 “类型不匹配:无法从元素类型对象转换为数字” 在for()语句上

    似乎是因为我已经参数化了dummy类,在主方法中创建了新的dummy()(不指定类型参数),导致getlist()方法的类型信息不再可用:编译器不再知道列表元素的类型,因此无法将它们赋给numb类型的循环变量。呃。如果类上的<t>声明与<没有任何关系,为什么会缺少此类型信息?扩展getList()方法上的数字声明?

    此外,如果我现在将虚拟实例更改为:

    Dummy<?> dummy = new Dummy();
    

    然后类型信息再次可用,类再次编译。那么,为什么允许“未知类型的虚拟机”保留其getList()类型信息,而虚拟机(可能是未知类型,因为我没有指定参数)会丢失它?

    也许我是个傻瓜——)

    2 回复  |  直到 15 年前
        1
  •  4
  •   denis.zhdanov    15 年前

    一般的想法是,如果使用参数化类型的原始版本,所有与类型相关的信息都将被清除。它包括类类型参数或泛型方法参数所隐含的类型信息。

    描述了非常相似的示例 here .

        2
  •  0
  •   non sequitor    15 年前

    我以前遇到过这个问题,但解释它可能会使您更加困惑,因此我将您链接到上的jls部分。” Raw Types “如果你不明白的话,你可以通过阅读来完全理解正在发生的事情,然后你可以带着更多的问题回来。