为什么java中的"超类型令牌"模式需要匿名类

sup*_*uli 11 java generics types anonymous parameterized-types

在Neal Gafter的"超类型令牌"模式(http://gafter.blogspot.com/2006/12/super-type-tokens.html)中,使用匿名对象传递参数化类型:

class ReferenceType<T>{}

/* anonymous subclass of "ReferenceType" */
ReferenceType<List<Integer>> referenceType = new ReferenceType<List<Integer>>(){

};
Type superClass = b.getClass().getGenericSuperclass();
System.out.println("super type : " + superClass);
Type genericType = ((ParameterizedType)superClass).getActualTypeArguments()[0];
System.out.println("actual parameterized type : " + genericType);
Run Code Online (Sandbox Code Playgroud)

然后结果是:

super type : com.superluli.test.ReferenceType<java.util.List<java.lang.Integer>>
actual parameterized type : java.util.List<java.lang.Integer>
Run Code Online (Sandbox Code Playgroud)

我的问题是,匿名对象"referenceType"的作用是什么让它起作用?如果我定义一个"ReferenceType"的显式子类并使用它而不是匿名样式,它就不会如预期的那样.

class ReferenceType<T>{}
class ReferenceTypeSub<T> extends ReferenceType<T>{}

/* explicitly(or, named) defined subclass of "ReferenceType" */
ReferenceType<List<Integer>> b = new ReferenceTypeSub<List<Integer>>();
Type superClass = b.getClass().getGenericSuperclass();
System.out.println("super type : " + superClass);
Type genericType = ((ParameterizedType)superClass).getActualTypeArguments()[0];
System.out.println("actual parameterized type : " + genericType);
Run Code Online (Sandbox Code Playgroud)

结果是:

super type : com.superluli.test.ReferenceType<T>
actual parameterized type : T
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 13

这个

ReferenceType<List<Integer>> referenceType = new ReferenceType<List<Integer>>(){
Run Code Online (Sandbox Code Playgroud)

相当于

public class AnonymousReferenceType extends ReferenceType<List<Integer>> {}
...
ReferenceType<List<Integer>> referenceType = new AnonymousReferenceType();
Run Code Online (Sandbox Code Playgroud)

黑客可以解决Class#getGenericSuperclass()哪些州

返回Type表示此Class表示的实体的直接超类(类,接口,基本类型或void). 如果超类是参数化类型,则Type返回的对象 必须准确反映源代码中使用的实际类型参数.如果之前没有创建超类,则创建表示超类的参数化类型.有关ParameterizedType参数化类型的创建过程的语义,请参阅声明 .如果它Class表示Object类,接口,基本类型或void,则null返回.如果此对象表示数组类,则返回Class表示Object该类的对象.

换句话说,超类AnonymousReferenceType是一个ParameterizedType代表ReferenceType<List<Integer>>.这ParameterizedType有一个实际的类型参数,这是List<Integer>源代码中出现的参数.


在你的第二个例子中,与你的第一个例子不同,

class ReferenceType<T>{}
class ReferenceTypeSub<T> extends ReferenceType<T>{}
Run Code Online (Sandbox Code Playgroud)

超类(超类型)的ReferenceTypeSubReferenceType<T>这是一个ParameterizedType地方的实际类型参数是一个TypeVariable命名的T,这是出现在源代码.


要回答您的问题,您不需要匿名课程.您只需要一个声明要使用的类型参数的子类.