返回getClass方法的类型

Pau*_*ton 7 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) {

    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

我接受了yshavit的答案,因为它清楚地回答了我的问题,但我仍然很想知道他们为什么这样定义它.他们可以将它定义为具有类型Class<? extends T>,其中T是静态类型的表达式.我不清楚为什么在这个阶段删除类型信息是必要的.如果类型是有意义的List<String>,但不是如果它是T.我会向任何解释这个问题的答案进行投票.

ysh*_*vit 7

表达式的静态类型|X|擦除在哪里(强调添加)

擦除T tIS Object,所以|X|Object在这种情况下.这意味着结果类型Class<? extends Object>(基本上等同于Class<?>).

String s另一方面,擦除是String(因为String是可再生的类型 - 即,不是通用的).