好的,所以 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/