java - Foo<?> 是否等同于未参数化的 Foo?

标签 java generics

<分区>

我有两个类,Foo 和 Bar,带有类型声明:

class Foo<T>
class Bar<Foo>

这会导致编译器警告,因为 Bar 中的 Foo 参数没有参数化。理想情况下,我想避免编译器警告,但我确实希望 Bar 接受任何 Foo。所以我尝试了这个:

class Foo<T>
class Bar<Foo<?>>

这似乎工作正常,但我担心我可能遗漏了细微的差别。有吗?

最佳答案

是的,有。考虑这个 -

List<?> myList;

除 null 外,您不能将任何内容放入此列表。除了 Object 之外,您也无法从此列表中获取任何内容。因此,编译器不允许您通过添加不同类型的对象来破坏此列表的类型不变性。如果您尝试这样做,您将遇到编译时错误。

但是如果您考虑以下列表(原始类型)-

List myList;

然后你可以从这里放任何东西/得到任何东西。因此,可以通过放置不同类型的对象轻松地破坏此列表,并且您只能在运行时从 ClassCastException 中发现这一点(如果您幸运的话......)。

因此,对于您的情况,请使用以下方法 -

class Foo<T>
class Bar<Foo<?>>

如果可以的话,远离第一个。

有关更多信息,请查看 Effective Java -

  1. 条款 23 - 不要在新代码中使用原始类型
  2. 第 26 项 - 支持泛型

关于java - Foo<?> 是否等同于未参数化的 Foo?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18546770/

相关文章:

可选泛型类型的 Swift 扩展

java - Surefire 和 OpenClover - 如果测试失败生成 Clover 报告

java - 如果我们在 WAS 8.5 中添加 JDBC 提供程序,服务将失败

java - 尝试在另一个类(class)中绘制小程序

java - 按类动态检索监听器实例

java - 声明泛型

java - Java中具有较小Double值的逆累积贝塔分布函数

java - 如何获取我们自定义的AlertDialog的值?

c - 使用C _Generic 时是不是不能使用括号?

generics - 有没有一种安全的方法可以为函数的不可变和可变变体重用相同的代码?