返回getClass方法的类型

时间:2015-03-22 00:45:54

标签: java generics

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,则无效。我会对任何解释这一点的答案进行投票。

1 个答案:

答案 0 :(得分:7)

  

其中|X|是表达式的静态类型的擦除(强调添加)

T t的{​​{3}}为Object,因此|X|Object。这意味着结果类型为Class<? extends Object>(基本上等同于Class<?>)。

另一方面,String s的删除是String(因为Stringerasure类型 - 即非通用的。)

相关问题