Object的“public final Class<?> getClass()”方法的文档说:
实际结果类型是 Class<? 扩展 |X|> 其中 |X| 是调用 getClass 的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换:
我不明白解释,尤其是关于什么 |X| 据说是-“删除调用getClass的表达式的静态类型”。
|X|是什么形式的符号 ? 或者也许,还有什么地方可以|X| 使用类型符号?
Object的“public final Class<?> getClass()”方法的文档说:
实际结果类型是 Class<? 扩展 |X|> 其中 |X| 是调用 getClass 的表达式的静态类型的擦除。例如,此代码片段中不需要强制转换:
我不明白解释,尤其是关于什么 |X| 据说是-“删除调用getClass的表达式的静态类型”。
|X|是什么形式的符号 ? 或者也许,还有什么地方可以|X| 使用类型符号?
Java 语言规范要求编译器以特殊方式处理此方法:
该方法
getClass
返回Class
表示对象类的对象。
Class
每个引用类型都存在一个对象。例如,它可以用来发现一个类的完全限定名、它的成员、它的直接超类以及它实现的任何接口。getClass 的方法调用表达式的类型是
Class<? extends |T|>
在哪里T
为 getClass 搜索的类或接口(第 15.12.1 节)。
因此 getClass 的返回类型getClass()
是调用表达式的静态(编译时)类型。例如:
String s = "";
Object o = s;
Class<? extends String> sc = s.getClass(); // ok
Class<? extends Object> oc = o.getClass(); // ok
oc = sc; // ok
sc = o.getClass(); // not ok
sc = oc; // not ok
该符号在规范|X|
中定义如下:
类型擦除是从类型(可能包括参数化类型和类型变量)到类型(从不参数化类型或类型变量)的映射。
|T|
我们为擦除类型而写作T
。擦除映射定义如下:
参数化类型(§4.5)的擦除
G<T1,...,Tn>
是|G|
.嵌套类型的擦除
T.C
是|T|.C
.数组类型的擦除
T[]
是|T|[]
.类型变量的擦除(第 4.4 节)是其最左边界的擦除。
所有其他类型的擦除都是类型本身。
例如,如果我们有:
List<String> list = ...;
表达式list.getClass()
是 typeClass<? extends List>
而不是Class<? extends List<String>>
.
让我们考虑以下示例:
List<Integer> test = new ArrayList<Integer>();
Class<? extends List> clazz = test.getClass();
test
( the expression on which getClass() is called
)的静态类型属于List<Integer>
擦除类型List
(请参见擦除类型)。请注意,动态(或运行时)类型test
是ArrayList
,运行时类型clazz
将是Class<ArrayList>
。
所以,Class<? extends |X|>
在这种情况下是Class<? extends List>
。