getClass()文档中的“删除表达式的静态类型”是什么意思?


问题内容

Object 的“公共最终Class <?>
getClass()”
方法的文档说:

实际结果类型为Class <?扩展| X |>其中| X | 是擦除在其上调用getClass的表达式的静态类型。例如,此代码段中不需要强制转换:

我不理解解释,尤其是关于| X |的解释。据说是-“删除调用getClass的表达式的静态类型”。

| X |是什么形式的符号??也许,| X |还有什么地方?使用类型符号?


问题答案:

Java语言规范要求编译器以特殊方式处理此方法:

该方法getClass返回表示Class对象类的对象。

Class每个引用类型都有一个对象。例如,它可以用于发现类的完全限定名称,其成员,其直接超类以及其实现的任何接口。

getClass的方法调用表达式的类型是Class<? extends |T|>where,其中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|为消除type而写T。擦除映射定义如下:

  • 参数化类型(第4.5节)的擦除G<T1,...,Tn>|G|

  • 嵌套类型的擦除T.C|T|.C

  • 删除数组类型T[]|T|[]

  • 擦除类型变量(第4.4节)是擦除其最左边界。

  • 其他所有类型的擦除都是该类型本身。

例如,如果我们有:

List<String> list = ...;

表达式list.getClass()是类型Class<? extends List>而不是类型Class<? extends List<String>>