当前位置: 首页 > 知识库问答 >
问题:

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

仲孙兴平
2023-03-14
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

共有1个答案

常坚
2023-03-14
ReferenceType<List<Integer>> referenceType = new ReferenceType<List<Integer>>(){

相当于

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

该黑客攻击围绕类#getGenericSuperClass()工作,该类声明

返回类型,该类型表示由该类表示的实体(类、接口、基元类型或void)的直接超类。如果超类是参数化类型,则返回的type对象必须准确地反映源代码中使用的实际类型参数。如果以前没有创建过表示超类的参数化类型,则创建该类型。有关参数化类型创建过程的语义,请参见ParameterizedType的声明。如果此表示对象类、接口、基元类型或void,则返回null。如果此对象表示数组类,则返回表示object类的classe对象。

class ReferenceType<T>{}
class ReferenceTypeSub<T> extends ReferenceType<T>{}
 类似资料:
  • 问题内容: 在Neal Gafter的“超级类型令牌”模式(http://gafter.blogspot.com/2006/12/super-type- tokens.html )中,使用了一个匿名对象来传递参数化类型: 那么结果是: 我的问题是,匿名对象“ referenceType”如何使它起作用?如果我定义“ ReferenceType”的显式子类并使用它而不是匿名样式,则它不是预期的。 结

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

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

  • 鉴于: 涉及和的语句编译良好,但失败,原因如下: 编译器错误可以通过提供显式类型参数

  • 在我的项目中,我有文件为FooClass类定义模式。我还配置了,以便在构建时为我生成类。 为什么我仍然需要指定架构注册表URL?难道我的使用者不能使用项目中的文件反序列化我的Kafka消息的值吗?

  • 问题内容: 根据JLS: 15.9.5匿名类声明编译器会自动从类实例创建表达式派生匿名类声明。 匿名类从不抽象(第8.1.1.1节)。匿名类始终是内部类(第8.1.3节);它永远不是静态的(第8.1.1节,第8.5.2节)。 匿名类始终是隐式最终的(第8.1.1.2节) 。 这似乎是一个特定的设计决定,所以它有一定的历史。 如果我选择上这样的课: 如果选择的话,为什么不允许我再次对其进行子类化?