我知道Collection<?>
,Collection<Object>
和Collection
之间的区别。
第一个仅采用任何类型,第二个必须允许所有对象,而第三个未选中。
但是对于单个实例(非Collection),例如ScheduledFuture<?>
,ScheduledFuture<Object>
和ScheduledFuture
有什么区别?似乎他们都允许一切。
最佳答案
Java语言规范写道:
仅允许使用原始类型作为对遗留代码兼容性的让步。强烈建议不要在将泛型引入Java编程语言后在编写的代码中使用原始类型。 Java编程语言的未来版本可能会禁止使用原始类型。
剩下的两个。由于ScheduledFuture
仅在方法返回类型中使用其type参数,因此ScheduledFuture<?>
(与ScheduledFuture<? extends Object>
相同)等同于ScheduledFuture<Object>
调用代码。
但是,实际创建ScheduledFuture实例的代码需要与ScheduledFuture的子类一起使用,并且可能会非常关心子类使用其实现ScheduledFuture的类型参数。
因此,在声明返回ScheduledFuture的方法时,您将要使用ScheduledFuture<?>
类型,因为对于ScheduledFuture的生产者来说,该签名更易于实现,但对它的使用者也同样有用。 (这只是PECS规则的特例。)