【问题标题】:Understanding generic upper bound wildcarts in java [duplicate]了解Java中的通用上限通配符[重复]
【发布时间】:2020-10-09 07:50:47
【问题描述】:

下面方法中的上限通配符意味着我们可以传入一个包含 Object 类型元素的列表或任何包含 Object 子类类型元素的列表,我不明白为什么下面没有编译,因为 string 是对象的子类:

public static void addSound(List<? extends Object> list) {
list.add("quack"); //does not compile
}

【问题讨论】:

  • List&lt;? extends Object&gt; 表示尚未定义的内容列表,但该内容是Object 的子类型。这并不意味着它是一个接受子类Object(即List&lt;Object&gt;)的列表。换句话说,当? extends Object 被确定时,它可能是不是String 的东西(仍然是Object 的子类型)。这就是为什么编译器不允许您将字符串强制转换为list
  • 这能回答你的问题吗? What is PECS (Producer Extends Consumer Super)?
  • @ernest_k 将其写为答案,以便可以接受。

标签: java collect


【解决方案1】:

上界泛型是不可变的。扩展类型可以是扩展对象的任何东西,它可以是 Ducks 列表。然后你就会明白为什么它不能工作了。 (list.add(new Duck()) 和 "quack" 不一样)

虽然下界工作

   public static void addSound(List<? super String> list) {
    list.add("quack"); //does compile
   }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
相关资源
最近更新 更多