getClass()方法的返回类型描述中的“静态类型表达式”是什么意思?

时间:2011-09-16 01:03:02

标签: java generics

Object类的getClass()方法返回 Class <? extends |T|>,其中|T|是表达式{{1}的表达式的静态类型的擦除}}方法被称为

我不明白'静态表达式'的含义。这是否意味着静态背景?也许我需要一些例子来更好地理解。

2 个答案:

答案 0 :(得分:5)

以下是一个例子:

String str = "a string";
Class<? extends String> c = str.getClass();

调用getClass()方法的表达式为strstr的静态类型为String。因此,在这种情况下,该方法返回Class<? extends String>,其中String是静态类型str的擦除。在这种情况下,擦除部分并不重要,因为String不是通用类。

这是另一个例子:

ArrayList<String> strList = new ArrayList<String>();
Class<? extends ArrayList> c2 = strList.getClass();

在这种情况下,表达式为strListstrList的静态类型为ArrayList<String>,该类型的 erasure ArrayList。这是擦除部分很重要的部分,因为它告诉您静态类型的任何类型参数在运行时都不可用。这是由于type erasure

由于类型擦除,以下内容无效:

ArrayList<String> strList = new ArrayList<String>();
Class<? extends ArrayList<String>> c2 = strList.getClass(); //error: incompatible types

答案 1 :(得分:2)

表达式的静态类型是变量的声明类型;这是编译器看到的。表达式的实际运行时(动态)值可能最终成为静态类型的子类型。例如:

Object o = functionReturningString();
Class<?> cls = o.getClass();

有效,但

Object o = functionReturningString();
Class<? extends String> cls = o.getClass();

不是。虽然:

Class<? extends String> cls = functionReturningString().getClass();

没关系