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

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

class ReferenceType{} /* anonymous subclass of "ReferenceType" */ ReferenceType<List> referenceType = new ReferenceType<List>(){ }; Type superClass = b.getClass().getGenericSuperclass(); System.out.println("super type : " + superClass); Type genericType = ((ParameterizedType)superClass).getActualTypeArguments()[0]; System.out.println("actual parameterized type : " + genericType); 

然后结果是:

 super type : com.superluli.test.ReferenceType<java.util.List> actual parameterized type : java.util.List 

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

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

结果是:

 super type : com.superluli.test.ReferenceType actual parameterized type : T 

这个

 ReferenceType> referenceType = new ReferenceType>(){ 

相当于

 public class AnonymousReferenceType extends ReferenceType> {} ... ReferenceType> referenceType = new AnonymousReferenceType(); 

该hack适用于Class#getGenericSuperclass()

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

换句话说, AnonymousReferenceType的超类是表示ReferenceType>ParameterizedType 。 此ParameterizedType具有实际类型参数,并且是List ,它是源代码中显示的内容。


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

 class ReferenceType{} class ReferenceTypeSub extends ReferenceType{} 

ReferenceTypeSub的超类(超类型)是ReferenceType ,它是ParameterizedType ,其中实际类型参数是名为TTypeVariable ,它出现在源代码中。


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