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>>
。