java - 泛型和通配符 : Java likes "new Foo<Bar<?>>"

标签 java generics

好的,所以 Java 不允许以下内容:

Foo<?> hello = new Foo<?>();

这是有道理的——毕竟,如果您只是想装箱/拆箱所有东西,泛型有什么意义呢?

奇怪的是,Java 确实允许这样做:

Foo<Bar<?>> howdy = new Foo<Bar<?>>();

诚然,这实际上完成了更多,但在某些时候,会有一个转换来获取 Bar 正在使用的任何内容。但是,如果 Java 可以接受一些特殊性,为什么它不允许这样做呢?:

Foo<? extends Mal> bonjour = new Foo<? extends Mal>();

我问的唯一原因是我决定依赖“构造函数的类参数内的通配符”,并且非常想知道它背后的含义/意图。

编辑:为了澄清我的问题,允许/禁止这些陈述的理由是什么?我知道“Java 不允许在构造函数中使用通配符”,但问题是,为什么所有这些怪事?如果嵌套通配符可以,为什么不允许有界通配符?

最佳答案

至于理由:new Foo<?>最好写成 new Foo<Object> ,所以这里的编译器限制强制编写尽可能可读的代码。最后一个例子同样可以是 new Foo<Mak>() ,因为在 Foo<? extends Mal> 上你无能为力你不能在 Foo<Mal> 上做.请注意,反之则不然:a Foo<Mal>可能会接受 Mal Foo<? extends Mal> 的参数没有。

另一方面,您可能真的想要一个 Foo可以处理的对象 Bar任何种类的物体,所以Foo<Bar<?>>很有道理。如果您只访问 Bar 的方法,就会出现这种情况。它不依赖于类型参数。编译器在这里没有什么可提示的。

关于java - 泛型和通配符 : Java likes "new Foo<Bar<?>>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11550804/

相关文章:

java - Jenkins_ maven 项目出现编译错误(找不到符号),导致构建失败

java - boolean 值和 if 条件的 Android Studio SharedPreferences

java - BouncyCaSTLe 最后一个字节解密问题

java - 为什么可以对 TableColumn<T, S> 中的两种泛型类型使用相同的泛型类型?

java - 通过存储在Java通用对象中的json对象的字段获取数据

java - 当每个单元格都不可编辑时使 JTable 行可选择

java - 是否有适用于 Java 的高效 2D ArrayList 类?

C# 泛型 : What does IComparable<Nullable<T>> mean?

python - 如何将 ListView 添加到通用 DetailView ? Django

generics - 类型参数与 std::ops::BitXor 输出关联类型之间的类型不匹配