gpt4 book ai didi

java - 为什么java中的 "super type token"模式需要匿名类

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:11 26 4
gpt4 key购买 nike

在 Neal Gafter 的“父类(super class)型标记”模式 (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);

那么结果是:

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

我的问题是,匿名对象“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);

结果是:

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

最佳答案

这个

ReferenceType<List<Integer>> referenceType = new ReferenceType<List<Integer>>(){

相当于

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

黑客围绕 Class#getGenericSuperclass() 工作哪个州

Returns the Type representing the direct superclass of the entity (class, interface, primitive type or void) represented by this Class. If the superclass is a parameterized type, the Type object returned must accurately reflect the actual type parameters used in the source code. The parameterized type representing the superclass is created if it had not been created before. See the declaration of ParameterizedType for the semantics of the creation process for parameterized types. If this Class represents either the Object class, an interface, a primitive type, or void, then null is returned. If this object represents an array class then the Class object representing the Object class is returned.

换句话说,AnonymousReferenceType 的父类(super class)是 ParameterizedType代表ReferenceType<List<Integer>> .这ParameterizedType有一个实际的类型参数,它是一个 List<Integer>这是源代码中出现的内容。


在您的第二个示例中,与您的第一个示例不同

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

ReferenceTypeSub 的父类(super class)(父类(super class)型)是 ReferenceType<T>这是 ParameterizedType其中实际类型参数是 TypeVariable名为 T ,这是源代码中出现的内容。


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

关于java - 为什么java中的 "super type token"模式需要匿名类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com