为什么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
,其中实际类型参数是名为T
的TypeVariable
,它出现在源代码中。
要回答您的问题,您不需要匿名课程。 您只需要一个声明要使用的类型参数的子类。