当前位置: 首页 > 面试题库 >

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

朱俊雅
2023-03-14
问题内容

在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);

那么结果是:

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()哪些州工作

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

换句话说,的超类AnonymousReferenceTypeParameterizedType代表ReferenceType<List<Integer>>。它ParameterizedType有一个实际的类型实参,即List<Integer>源代码中出现的那个。

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

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

的父类(父类)ReferenceTypeSubReferenceType<T>ParameterizedType其中实际类型实参为TypeVariablenamed
T,这是源代码中出现的名称。

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



 类似资料:
  • 我的问题是,匿名对象“referenceType”有什么魔力让它工作?如果我定义了一个“referenceType”的显式子类,并使用它来代替匿名样式,它就不会像预期的那样。 结果是:

  • 在java中,我们有一些方法来实现一些逻辑。那么匿名函数有什么用呢?当我们真的需要匿名函数时。

  • 我使用的是Spring Security 3.2.0。带有Java配置的RC2。我设置了一个简单的HttpSecurity配置,要求在/v1/**上进行基本身份验证。GET请求正常,但POST请求失败: 我的安全配置如下所示: 对此有任何帮助,非常感谢。

  • 问题内容: 在Heinz Kabutz的时事通讯上的最后一期#255 Java 10:推断的局部变量中 ,它在Java 10中不是保留字,因为您还可以将其用作标识符: 但是,不能将ie 用作标识符,如中的,因为它是保留字。 正如在链接的新闻通讯中所讲的那样,不是保留字的事实是个好消息,因为这允许来自Java早期版本的用作标识符的代码得以编译而在Java 10中没有问题。 那么,那是什么?它既不是语

  • 问题内容: 我不明白为什么我不能总是从“侦听器”或“处理程序”内部访问变量。 这是我的代码: 唯一的方法是使用关键字声明它: 为什么需要声明变量 final 以获取事件内部的访问权限? 问题答案: 您是一个匿名内部类,我认为这很清楚: 本地类绝对可以引用实例变量。它们无法引用非最终局部变量的原因是,方法返回后,局部类实例可以保留在内存中。当该方法返回时,局部变量超出范围,因此需要它们的副本。如果变

  • 问题内容: 鉴于: 涉及并编译的语句很好,但是失败: 可以通过提供显式类型参数来解决编译器错误。 Java 8何时需要显式类型参数?意思是,是否存在一种打破类型推断的已知模式? 能和改变,以避免显式类型参数不失使用生成器的配置的收藏家? 更新 : 为什么涉及工作的陈述?它与所涉及的陈述有何不同? 问题答案: 要回答您的问题“意思是,是否存在一种已知的打破类型推断的模式?” 简短地说:当然,有一种模