从具有类型参数的类中获取.class

时间:2015-02-06 15:28:20

标签: java generics

为什么这不可能?

List<Foo>.class

或者更具体地说,让A成为具有类型参数的类(即class A<T> { // code },为什么new A<T>().getClass()可能A<Foo>.class编译错误?

3 个答案:

答案 0 :(得分:2)

在泛型中,&lt;和&gt;只是Generic类的一个选项。

在您的示例中,类是List,因此您可以键入List.class(如果已实例化,则键入list.getClass())

列表与LT; T&GT;只是一个列表,具有完全相同的类。 T仅由编译器用于检查一致性。

答案 1 :(得分:0)

new A<T>().getClass()返回与A.class完全相同的对象。 Class个对象表示没有通用信息的原始类型。 A<T>.class只会对它实际代表的内容撒谎,所以不允许这样做。

答案 2 :(得分:0)

我认为这是一个公平的问题。

这很好用:

    Class c = new ArrayList().getClass();
    c= ArrayList.class;

这不是:

    c = new ArrayList<String>().getClass(); // still ok
    c = ArrayList<String>.class;  // compilation fails

无论是否使用泛型类型,结果总是相同的。

new ArrayList<String>().getClass()相比,此new ArrayList().getClass()没有带来任何更多内容,并且已被接受。

ArrayList<String>.class相比,此ArrayList.class没有带来任何更多内容,而不是{{1}}。

那么,为什么?

可能正是编译器尽力阻止我们编写无用的代码。