【问题标题】:What's the difference between <?> and <? extends Object> in Java Generics?<?> 和 < 有什么区别?在 Java 泛型中扩展 Object>?
【发布时间】:2011-11-08 18:33:15
【问题描述】:

我以前见过通配符表示任何对象 - 但最近看到了一个用法:

<? extends Object>

由于所有对象都扩展了 Object,这两种用法是同义词吗?

【问题讨论】:

  • @Dan 如果您在该问题中搜索“? extends Object”,您什么也找不到。我正在阅读答案,看看我是否可以推断出任何东西,但我认为不是这样。具体来说,它不是在谈论泛型。
  • @Dan - 这是一个不同的问题。我以前见过这个问题,我记得至少提到了一个细微的差别。让我看看能不能找到它..
  • 找到也不是这个:stackoverflow.com/questions/678822/…
  • 我们开始吧:Unbounded wildcards in Java 的可能重复项(Kevin Bourrillion 的回答不正确。)

标签: java syntax generics


【解决方案1】:

&lt;?&gt;&lt;? extends Object&gt; 是同义词,正如您所料。

在一些泛型情况下,extends Object 实际上并不是多余的。例如,&lt;T extends Object &amp; Foo&gt; 将导致T 在擦除状态下变为Object,而&lt;T extends Foo&gt; 将在擦除状态下变为Foo。 (如果您试图保持与使用 Object 的预泛型 API 的兼容性,这可能很重要。)

来源:http://download.oracle.com/javase/tutorial/extra/generics/convert.html;它解释了为什么 JDK 的 java.util.Collections 类有一个带有这个签名的方法:

public static <T extends Object & Comparable<? super T>> T max(
    Collection<? extends T> coll
)

【讨论】:

  • 我不清楚这个例子是如何关联的? (因为它既不使用 > 也不使用 extends Object>)
  • @orbfish:这只是因为我认为你会觉得它很有趣,因为这是一个例子,extends Object 实际上有意义的。如果我弄错了,那么我道歉。希望至少遇到您的问题的其他人会对此感兴趣。
  • @ruakh - 对有界通配符而不是类型参数感兴趣,但至少你回答了。
  • 你应该在原来的帖子中说明这一点。这样一来,他的回答可能更适合你。
【解决方案2】:

虽然&lt;?&gt; 应该是&lt;? extend object&gt; 的快捷方式,但两者之间还是有细微差别的。 &lt;?&gt; 是可具体化的,而 &lt;? extend object&gt; 不是。他们这样做的原因是为了更容易区分具体类型。任何看起来像 &lt;? extends something&gt;,&lt;T&gt;,&lt;Integer&gt; 的东西都是不可具体化的。

例如,这段代码可以工作

List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;

但这会报错

List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;

有关更多信息,请阅读 Maurice Naftalin 撰写的 Java 泛型和集合

【讨论】:

  • 如果编译器将 List> 转换为 List 那么如何实现关于什么类型的信息?丢了吗?
  • 我认为 > 更适合与遗留 API 向后兼容。区分 和 extends Object> 是 Java 5 后的代码。
【解决方案3】:

&lt;?&gt;&lt;? extends Object&gt; 的简写。 您可以阅读下面的共享链接了解更多详情。


<?>

"?" 表示任何未知类型,它可以表示代码中的任何类型。如果您不确定类型,请使用此通配符。

ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number

注意: &lt;?&gt; 表示任何东西。所以它可以接受不是从Object 类继承的类型。

<? extends Object>

&lt;? extends Object&gt; 表示您可以传递一个 Object 或扩展 Object 类的子类。

ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number 

T——用于表示类型
E – 用于表示元素
K – 键
V - 价值观
N – 数字
Ref:

【讨论】:

  • “所以它可以接受不是从Object类继承的Type”,但是所有Java类都继承或隐式继承自Object类。
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
  • 2010-10-15
  • 2020-10-06
  • 2011-01-12
相关资源
最近更新 更多