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

“为什么在”中需要匿名类;“超级类型令牌”;java中的模式,java,generics,types,anonymous,parameterized-types,Java,Generics,Types,Anonymous,Parameterized Types,在Neal Gafter的“超级类型令牌”模式()中,使用匿名对象传入参数化类型: class ReferenceType<T>{} /* anonymous subclass of "ReferenceType" */ ReferenceType<List<Integer>> referenceType = new ReferenceType<List<Integer>>(){ }; Type superClass = b.get

在Neal Gafter的“超级类型令牌”模式()中,使用匿名对象传入参数化类型:

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);
类引用类型{}
/*“ReferenceType”的匿名子类*/
ReferenceType ReferenceType=新的ReferenceType(){
};
类型超类=b.getClass().getGenericSuperclass();
System.out.println(“超类型:+超类”);
类型genericType=((ParameteredType)超类).getActualTypeArguments()[0];
System.out.println(“实际参数化类型:“+genericType”);
结果是:

super type : com.superluli.test.ReferenceType<java.util.List<java.lang.Integer>>
actual parameterized type : java.util.List<java.lang.Integer>
super-type:com.superluli.test.ReferenceType
实际参数化类型:java.util.List
我的问题是,匿名对象“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);
类引用类型{}
类ReferenceTypeSub扩展ReferenceType{}
/*“ReferenceType”的显式(或命名)定义的子类*/
ReferenceType b=新的ReferenceTypeSub();
类型超类=b.getClass().getGenericSuperclass();
System.out.println(“超类型:+超类”);
类型genericType=((ParameteredType)超类).getActualTypeArguments()[0];
System.out.println(“实际参数化类型:“+genericType”);
结果是:

super type : com.superluli.test.ReferenceType<T>
actual parameterized type : T
super-type:com.superluli.test.ReferenceType
实际参数化类型:T
这个

ReferenceTypeSub
的超类(超类型)是一个
ReferenceType
,它是一个
参数化类型
,其中实际的类型参数是一个名为
T
类型变量
,它出现在源代码中



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

不清楚您不理解本文的哪一部分(特别是),因为它很好地解释了这一点。他呈现的类是抽象的,因为由于类型擦除(这在文章中有解释)。。。这就是它的工作原理。这就是本文的全部要点。你的第二个例子基本上就是整个要点——由于类型擦除,在Java中无法工作。嗨,Brian,我认为这与类型擦除无关,如果我错了,请纠正我。类型擦除意味着在编译期间,泛型类型将从源代码中删除,JVM不会在运行时使用它们进行类型检查。但另一方面,这些信息都没有“实际丢失”:它们在编译期间仍保存在.class文件中,因此由类加载器加载到类对象池中。Java反射提供了接口,让我们检索这些信息。因此,在这两个示例中,类型都被删除。实际的区别是,在第一个示例中,“ReferenceType”之类的内容保存在匿名类的.class文件中,而在第二个示例中,“ReferenceType”被保存。基本上,您的级别太深了。仅当子类在声明中提供具体类型时,才能从直接超类获取泛型类型。类型擦除将导致您喝酒(相信我)。然后,有关参数化类型“List”的信息将保存在AnonymousReferenceType.class文件中。问题是,为什么在第二个示例中,文本“T”保存在那里,而不是我声明的实际类型“List”?另外,请参考我发表自己想法的原始问题的评论,但不确定它是否正确。过了一段时间,我现在明白了。就像你说的,这一切都来自于类声明。在第一个示例中,“List”在匿名类的声明中,而在第二个示例中,它是T。
ReferenceType<List<Integer>> referenceType = new ReferenceType<List<Integer>>(){
public class AnonymousReferenceType extends ReferenceType<List<Integer>> {}
...
ReferenceType<List<Integer>> referenceType = new AnonymousReferenceType();
class ReferenceType<T>{}
class ReferenceTypeSub<T> extends ReferenceType<T>{}