【问题标题】:Generics: What is the difference between ?, Object, and raw type of a single instance?泛型:单个实例的 ?、Object 和 raw 类型有什么区别?
【发布时间】:2014-09-30 19:54:48
【问题描述】:

我知道Collection<?>Collection<Object>Collection 之间的区别。

第一个只接受任何类型,第二个必须允许所有对象,第三个是未选中的。

但是对于单个实例(非集合),例如ScheduledFuture<?>ScheduledFuture<Object>ScheduledFuture,有什么区别?似乎他们都允许一切。

【问题讨论】:

  • 嗯,ps:我想Collection<Object> != Collection<? extends Object>
  • Collection 示例和ScheduledFuture 示例之间的泛型用法绝对没有区别。
  • > = 任何东西, 期望完全是一个对象(不会接受其他任何东西)和第三个,嗯...
  • @Sebas,我同意。我在哪里说过他们是平等的?
  • @Leo,所以区别在于 > 取空?

标签: java generics


【解决方案1】:

Java 语言规范写道:

仅允许使用原始类型作为对遗留代码兼容性的让步。强烈反对在将泛型引入 Java 编程语言之后编写的代码中使用原始类型。 Java 编程语言的未来版本可能不允许使用原始类型。

剩下两个。由于ScheduledFuture只在方法返回类型中使用其类型参数,ScheduledFuture<?>(与ScheduledFuture<? extends Object>相同)相当于ScheduledFuture<Object>调用代码。

但是,实际创建 ScheduledFuture 实例的代码需要使用 ScheduledFuture 的子类,并且可能非常关心子类实现 ScheduledFuture 的类型参数。

当声明返回 ScheduledFuture 的方法时,您将因此希望使用类型 ScheduledFuture<?>,因为该签名对于 ScheduledFuture 的生产者来说更容易实现,但对其消费者同样有用。 (这只是PECS 规则的一个特例。)

【讨论】:

    【解决方案2】:

    它们不可互换。没有类型说明符的集合是未绑定的,因此其 API 方法将默认返回 Object。有关Collection<?>Collection<Object> 之间区别的良好解释,请参阅此问题:What is the difference between ? and Object in Java generics?

    【讨论】:

    • 我不是在寻找这 3 个集合是否可以互换,我知道它们不是。我对提到的 3 个 ScheduledFuture 感兴趣
    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2014-02-19
    • 2019-08-29
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多