好吧,所以Java不允许以下内容:
Foo<?> hello = new Foo<?>();
Run Code Online (Sandbox Code Playgroud)
这是有道理的 - 毕竟,如果你只是想打包/拆箱一切,那么仿制药有什么意义呢?
奇怪的是,Java 确实允许这样做:
Foo<Bar<?>> howdy = new Foo<Bar<?>>();
Run Code Online (Sandbox Code Playgroud)
当然,这实际上可以实现更多,但在某些时候,会有一个演员来获得任何Bar合作.但是如果Java有一定的特殊性,为什么它不允许这样做?:
Foo<? extends Mal> bonjour = new Foo<? extends Mal>();
Run Code Online (Sandbox Code Playgroud)
我问的唯一原因是我正在修复依赖于"构造函数的类参数中的通配符",并且非常想知道它背后的含义/意图.
编辑:澄清我的问题,这些陈述允许/不允许的理由是什么?我知道"Java不允许在构造函数中使用通配符",但问题是,为什么这些奇怪呢?如果嵌套通配符可以,为什么不允许有界通配符?
至于基本原理:new Foo<?>应该最好写成new Foo<Object>,所以这里的编译器限制强制将代码编写为尽可能可读.最后一个例子同样可以new Foo<Mak>(),因为你无法做任何你不能做的Foo<? extends Mal>事情Foo<Mal>.请注意,反之亦然:a Foo<Mal>可能接受Mala所Foo<? extends Mal>不具有的参数.
另一方面,你真的可能想要一个Foo可以处理Bar任何类型对象的对象,因此Foo<Bar<?>>非常有意义.如果您只访问Bar不依赖于类型参数的方法,则会出现这种情况.编译器没有什么可以抱怨的.