【问题标题】:Generic concept of extends and super扩展和超级的通用概念
【发布时间】:2013-06-05 13:57:24
【问题描述】:

通用扩展背后的概念是什么,为什么不允许修改 列表;为什么当我将字符串添加到 list 时会引发编译时错误,因为 String 扩展了 Object 并且应该是合法的。

如果这给出了编译错误,那么创建的那个列表有什么用。

         List<? extends Object>  ls=new ArrayList<String>();
         ls.add("asd");  // compilation error

并且在super的情况下编译。

         List<? super Integer> ls1=new ArrayList<Object>();
         ls1.add(1);

我已阅读 Kathy Sierra 和 Javadoc,但无法理解这意味着什么。请给我一个详细的解释和例子来理解这一点。

【问题讨论】:

  • 我已经读过,这并不能解释为什么在 super 而不是在 extends 上允许 add 方法。
  • 如果您阅读了答案,它确实可以解释。
  • hmm 在运行时任何对象都可以出现,那么 super 是如何工作的,我无法理解:/

标签: java list generics


【解决方案1】:

您不能将字符串添加到 List&lt;? extends Object&gt;,因为 ?可以是任何东西。

如果你想把东西放入一个列表,它的类型参数应该是你要放入的类型的超类。(这包括类型本身。)

如果你想一个列表中获取东西,它的类型参数应该是你想取出的类型的子类。 (这包括类型本身。)

这可以用首字母缩写词 PECS - producer-extends,consumer-super 来记住。

【讨论】:

  • 所以这种列表只能用在参数中,不能实例化,这样我们就可以添加对象了,对吧??
  • ?不能是任何东西,我把它安全地输入为
  • 您可以创建和初始化一个引用列表,就像你上面所说的那样。您可以将其用作参数或其他地方。您不能通过此引用添加项目,因为引用类型的参数化类型可以是 Object 或任何子类。您已将 List 分配给引用,但类型检查正在检查引用的类型,而不是它在运行时指向的对象的类型。
【解决方案2】:

编译器不在乎尝试分析列表的实际泛型类型,它只检查ls 声明的泛型类型。和这里一样

void add(List<? extends Object> ls) {
   ls.add("1");
   ...

ls 可以是例如整数列表,您不能在其中添加“1”。

类似的解释适用于super

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多