Object
类的getClass()方法返回 Class <? extends |T|>
,其中|T|
是表达式{{1}的表达式的静态类型的擦除}}方法被称为。
我不明白'静态表达式'的含义。这是否意味着静态背景?也许我需要一些例子来更好地理解。
答案 0 :(得分:5)
以下是一个例子:
String str = "a string";
Class<? extends String> c = str.getClass();
调用getClass()
方法的表达式为str
。 str
的静态类型为String
。因此,在这种情况下,该方法返回Class<? extends String>
,其中String
是静态类型str
的擦除。在这种情况下,擦除部分并不重要,因为String
不是通用类。
这是另一个例子:
ArrayList<String> strList = new ArrayList<String>();
Class<? extends ArrayList> c2 = strList.getClass();
在这种情况下,表达式为strList
。 strList
的静态类型为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();
没关系