如果 C 参数化中的任何类型参数是 通配符,然后:
• C 中字段、方法和构造函数的类型
是捕获中字段、方法和构造函数的类型 C 的转换(第 5.1.10 节)。 • 设 D 是 C 中的一个(可能是通用的)类或接口声明。 那么 C
中 D 的类型为 D,其中,如果 D 是泛型,则所有 类型参数是无限通配符。
我不太明白最后一句是什么意思。这句话似乎是说内部泛型类的类型参数必须是无界通配符。但似乎事实并非如此。
有人可以向我详细解释这段话并举个例子吗?
感谢您的阅读和回答。
正如其下方的文字所述:“这没有任何后果”。
为了更清楚地说明这一点:
class Outer<T extends Number> {
class Inner<Z extends List<T>> {}
}
它指的是在Inner
参数化的上下文中
引用到类型
Outer
的概念。
这是无关紧要的(参见 JLS §4.5.2 末尾的注释),除了在
instanceof
中,它以不同的方式无关,因为 instanceof
不会(并且由于擦除而不能)实际执行任何操作任何仿制药:
List<?> x = new ArrayList<String>();
if (x instanceof List<Integer>) {
System.out.println("None of this works");
}
上面的代码无法编译;编译器知道你的意思,不会编译它,因为它是无意义的(
x
是一个指向某种列表实例的变量;该实例不知道它自己的泛型边界,所以instanceof
不能做什么你在这里问)。
重点是,编译器首先需要理解你的意思,然后才能告诉你你想要的东西是不可能的。您所询问的注释是关于编译器如何理解您的意思的。这并不重要,因为结果是相同的:你不能用 instanceof
做到这一点。