【问题标题】:Code with generics with super does not work as expected带有 super 的泛型代码无法按预期工作
【发布时间】:2013-04-05 05:33:03
【问题描述】:

我有以下代码:

List<? super Integer> numbers = new ArrayList<Number>();
numbers.add(new Integer(10));
Number object = numbers.get(0);  //this doesn't compile??

Object object = numbers.get(0);  //this does compile

如果我这样做:

numbers.add(new Object()); //doesn't compile in contradiction to above statement

这是什么原因?

【问题讨论】:

    标签: java generics compiler-construction type-conversion


    【解决方案1】:

    Number object 不起作用,因为编译器不知道numbersNumbers 的列表——它只知道它是Integer 的超类的列表。所以它可能是一个Objects 的列表,在这种情况下,将get 的结果存储在Number 变量中是行不通的。因此编译器不允许这样做。

    Object object 是允许的,因为将 get 的结果存储在 Object 变量中始终有效,因为您可以将任何内容存储在 Object 变量中。

    numbers.add( new Object() ) 不起作用的原因是您只能将Objects 添加到List&lt;Object&gt;s,但numbers 很可能是List&lt;Integer&gt;List&lt;Number&gt;(实际上是后者),所以这是不允许的。

    基本上你必须这样想:numbers可能是Integers的列表,Numbers的列表或Objects的列表,所以你只能执行那些对这三个中的任何一个都有效的操作。

    【讨论】:

      【解决方案2】:

      List&lt;? super Integer&gt; 允许numbers 成为Objects 的列表,而不仅仅是Numbers 的列表或Integers 的列表:

      List<? super Integer> numbers = new ArrayList<Object>();
      

      纯粹基于numbers的编译时类型,不能保证以下是类型安全的,因此被拒绝:

      Number object = numbers.get(0);  //this doesn't compile
      

      【讨论】:

        【解决方案3】:

        通过声明List&lt;? super Integer&gt;,您是说它可以接受任何属于Integer 超类的对象,其中还包括NumberObject。因此,您可以在该列表中添加 NumberObject 的实例,以便在从列表中检索最通用的类​​型时,即考虑 Object

        【讨论】:

          【解决方案4】:

          我认为您正在寻找使用任何 SUPER 整数类加载列表。 Object 是唯一的 Super 的 Integer 类。

          数字是一个对象,因此写new ArrayList&lt;Number&gt;()是合法的;

          但是当你尝试从 numbersList 中获取时,它只能是一个 Object。 因为 Object 是 Integer 的唯一 Super 类。

          如果您有任何疑问,或者您认为我需要纠正我的理解,请告诉我。

          问候, 韦诺德

          【讨论】:

          • 我认为他不认为Numberabstract class ;)
          • @Venod 错误不是因为 Number 是抽象的。错误是因为其他答案解释的原因。
          • 嗯,这绝对是错误的,因为 Object 是 Integer 的唯一超类
          猜你喜欢
          • 1970-01-01
          • 2014-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多