为什么Java的Class <T>是通用的?

rip*_*234 51 java generics

为什么Java是Class<T>通用的?

Ste*_* B. 33

这样可以使用泛型类型的方法 -

Class<Foo> klass = Foo.class;
Foo f = klass.newInstance();
Foo f = klass.cast(Object);
Run Code Online (Sandbox Code Playgroud)

  • ...(后续):请注意,编译的代码 - 即,Class <Foo> klass = Foo.class;` - 引发原始问题,因为`Foo.class`似乎已经提供了必要的信息.但是,使用通用类型方法的能力是正确的答案; 从这里给出的例子来看,这一点并不清楚. (5认同)

Bil*_*ard 14

在语言指南的1.5版本的泛型部分中简短地提到了这一点:

更令人惊讶的是,班级已经普及.类文本现在用作类型标记,提供运行时和编译时类型信息.这样可以在新的AnnotatedElement接口中使用getAnnotation方法示例的静态工厂样式:

<T extends Annotation> T getAnnotation(Class<T> annotationType); 
Run Code Online (Sandbox Code Playgroud)

这是一种通用方法.它从参数中推断出其类型参数T的值,并返回一个适当的T实例,如下面的代码片段所示:

Author a = Othello.class.getAnnotation(Author.class);
Run Code Online (Sandbox Code Playgroud)

在泛型之前,您必须将结果转换为Author.此外,您无法让编译器检查实际参数是否表示Annotation的子类


Jér*_*nge 8

真正的原因是Neil Gafter:

当我们在JDK5中向Java添加泛型时,我将类java.lang.Class更改为泛型类型.例如,String.class的类型现在是Class <String>.Gilad Bracha为此创造了类型代币.我的目的是启用一种特定风格的API,Joshua Bloch称之为THC或Typesafe Heterogenous Container模式.