Class<? extends Integer>
可以正常编译,但是Integer
是最终类型,因此将其用作上限是没有意义的(什么都不会extend
)。
如果您尝试使用最终类型作为类型参数的上限,您将收到编译器警告:
类型参数 T 不应受最终类型 Integer 的限制。最终类型无法进一步扩展
为什么使用最终类型作为通配符的上限完全没问题,但会为类型参数抛出警告?为什么 Java 甚至允许通配符以最终的大写类型为界?
Class<? extends Integer>
可以正常编译,但是Integer
是最终类型,因此将其用作上限是没有意义的(什么都不会extend
)。
如果您尝试使用最终类型作为类型参数的上限,您将收到编译器警告:
类型参数 T 不应受最终类型 Integer 的限制。最终类型无法进一步扩展
为什么使用最终类型作为通配符的上限完全没问题,但会为类型参数抛出警告?为什么 Java 甚至允许通配符以最终的大写类型为界?
Class<Integer>
不像Class<? extends Integer>
.
例如,这编译:
Class<? extends Number> numberClass = Integer.class;
Class<? extends Integer> integerClass = numberClass.asSubclass(Integer.class);
这不会:
Class<? extends Number> numberClass = Integer.class;
Class<Integer> integerClass = numberClass.asSubclass(Integer.class);
我自己,我无法像您一样收到编译器警告(也许您可以提供有关编译器的示例和详细信息?)。