好的,所以 Java 不允许以下内容:
Foo<?> hello = new Foo<?>();
这是有道理的——毕竟,如果你无论如何都要装箱/拆箱,那么泛型有什么意义呢?
奇怪的是,Java确实允许这样做:
Foo<Bar<?>> howdy = new Foo<Bar<?>>();
诚然,这实际上完成了更多,尽管在某些时候,会有一个演员来获得任何Bar
正在使用的东西。但是,如果 Java 在某些特定性上是可以接受的,为什么它不允许这样做呢?:
Foo<? extends Mal> bonjour = new Foo<? extends Mal>();
我问的唯一原因是我正在修复依赖“构造函数的类参数中的通配符”,并且非常想知道它背后的含义/意图。
编辑:为了澄清我的问题,允许/不允许这些陈述的依据是什么?我知道“Java 不允许在构造函数中使用通配符”,但问题是,为什么所有这些怪异?如果嵌套通配符可以,为什么不允许有界通配符?