getClass()
中方法Object
的文档说:
实际结果类型为
Class<? extends |X|>
,其中|X|
是擦除调用getClass的表达式的静态类型。
那么为什么foo
编译而不是bar
?
static void foo(String s) {
try {
Class<? extends String> clazz = s.getClass();
} catch (Exception e) {
}
}
static <T> void bar(T t) {
try {
Class<? extends T> clazz = t.getClass();
} catch (Exception e) {
}
}
修改
我已经接受了yshavit的回答,因为它清楚地回答了我的问题,但我仍然很想知道他们为什么这样定义它。他们可以将其定义为类型Class<? extends T>
,其中T
是表达式的静态类型。我不清楚为什么在此阶段删除类型信息是必要的。如果类型为List<String>
,则有意义,但如果类型为T
,则无效。我会对任何解释这一点的答案进行投票。
答案 0 :(得分:7)
其中
|X|
是表达式的静态类型的擦除(强调添加)
T t
的{{3}}为Object
,因此|X|
为Object
。这意味着结果类型为Class<? extends Object>
(基本上等同于Class<?>
)。
另一方面,String s
的删除是String
(因为String
是erasure类型 - 即非通用的。)