【问题标题】:Android Class.getGenericSuperclass returns java.lang.ObjectAndroid Class.getGenericSuperclass 返回 java.lang.Object
【发布时间】:2011-09-10 17:02:50
【问题描述】:

我正在尝试从课程中读取通用信息。这就是我正在做的事情:首先我有一个 EntityHelper 类。在里面的某个地方,我想看看那个 T 到底是什么。 我知道可以这样做:

(Class<T>) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

但是 getGenericSuperClass 返回的方法是 java.lang.Object - 这是不正确的,因为我知道 T 是其他东西,例如 DummyEntity。

我使用的 Android 平台是 7。这是某种错误还是我遗漏了一些重要的东西?

【问题讨论】:

  • 如何将java.lang.reflect.Type 转换为Class&lt;T&gt;?
  • 编译器不反对,它在运行时工作。例如: (Class>) ((ParameterizedType) f.getGenericType()).getActualTypeArguments()[0];其中 f 是 java.lang.Field。类实现了 Type - 也许它不是很好,但它可以工作。
  • Class implements Type- 我错过了。
  • 如何获得实际的泛型类型? java中的泛型是一种编译时机制(Type erasure)。
  • 实现这个效果的唯一方法是将Class&lt;T&gt;类型保存为成员变量。

标签: android generics reflection superclass


【解决方案1】:

您无法获取参数的泛型类型。泛型是使用称为type erasure 的技术实现的。实现此效果的唯一方法是保存 Class&lt;T&gt; 类型(即 使用Class Literals as Runtime-Type Tokens)。

【讨论】:

  • 它是使用类型擦除实现的,但保留了有关泛型类型的信息。如果这不是真的,那么方法 java.lang.Class#getGenericSuperclass() 就没有多大意义。我在我的一个 cmets 中发布的关于该问题的小代码片段检索列表中包含的对象的实际类型(使用泛型)并且它工作正常,因此可以这样做。
  • @ezamur:编译器将 type(T) 作为注释写入类文件中。
  • @ezamur: 你想看看声明的类型(比如 T,S...)吗?
  • @ezamur:打印java.lang.Field 并查看类型。
  • 好的,这可能比我预期的要复杂。不幸的是,正如你已经说过的,我的方法不起作用。另一方面,如果我在成员变量上使用它,它就可以工作。例如,如果我们有一个包含属性 List aList 的类,那么下一段代码将正确回答列表中对象的类型是什么: ((ParameterizedType)getClass().getField("aList ").getGenericType()).getActualTypeParameters()[0]。麻烦的是我找不到在类论点上做同样事情的方法。我想我将不得不接受你的回答。感谢您的时间和帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多