在getClass()文档中“删除它所调用的表达式的静态类型”是什么意思?
Object的“public final Class getClass()”方法的文档说:
实际的结果类型是Class where | X | 是擦除调用getClass的表达式的静态类型。 例如,此代码片段中不需要强制转换:
我不明白这个解释,特别是关于什么| X | 据说 – “擦除了调用getClass的表达式的静态类型”。
什么forms的符号是| X | ? 或者,也许,其他地方| X | 是否使用了表示法?
Java语言规范要求编译器以特殊方式处理此方法:
方法
getClass
返回表示对象类的Class
对象。每个引用类型都存在一个
Class
对象。 例如,它可用于发现类的完全限定名称,其成员,直接超类以及它实现的任何接口。getClass的方法调用表达式的类型是
Class extends |T|>
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
的擦除是|G|
。嵌套类型
TC
的擦除是|T|.C
。数组类型
T[]
的擦除是|T|[]
。类型变量(第4.4节)的擦除是其最左边界的擦除。
每种其他类型的擦除都是类型本身。
例如,如果我们有:
List list = ...;
表达式list.getClass()
的类型为Class extends List>
Class extends List>
而不是Class extends List
Class extends List
。
让我们考虑以下示例:
List test = new ArrayList (); Class extends List> clazz = test.getClass();
静态类型的test
( the expression on which getClass() is called
)是List
,其擦除是List
(参见类型擦除 )。 请注意,动态(或运行时)类型的test
是ArrayList
,而clazz
的运行时类型将是Class
。
那么, Class extends |X|>
Class extends |X|>
在这种情况下是Class extends List>
Class extends List>
。