Java 中内部泛型类的类型参数

问题描述 投票:0回答:1

JLS 4.5.2:

如果 C 参数化中的任何类型参数是 通配符,然后:

• C 中字段、方法和构造函数的类型 是捕获中字段、方法和构造函数的类型 C 的转换(第 5.1.10 节)。

• 设 D 是 C 中的一个(可能是通用的)类或接口声明。 那么 C 中 D 的类型为 D,其中,如果 D 是泛型,则所有 类型参数是无限通配符

我不太明白最后一句是什么意思。这句话似乎是说内部泛型类的类型参数必须是无界通配符。但似乎事实并非如此。

有人可以向我详细解释这段话并举个例子吗?

感谢您的阅读和回答。

java generics language-lawyer jls
1个回答
0
投票

正如其下方的文字所述:“这没有任何后果”。

为了更清楚地说明这一点:

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 做到这一点。

    

© www.soinside.com 2019 - 2024. All rights reserved.