我知道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规则的特例。)

10-08 12:57