Java 对未知泛型的反射(reflection)

标签 java android generics reflection

我正在玩 Java 泛型的学习目的,并尝试对它们使用反射。 就在我以为我理解了一半的同时,我遇到了我没有找到解决方法的问题。 我有一个简单的 Box 类:

public class ReflectionBox<E>  {
    protected E e;

    public ReflectionBox(){}
    public ReflectionBox(E element){ this.e = element; }

    public void set(E element){ e = element; }
    public E get(){ return e; }
    //... a few reflection methods...
}

我扩展了这个类来尝试用它实现一个接口(interface)。这个界面迫使我写这样的声明:

public static final Parcelable.Creator<ParcelableBox<?>> CREATOR = 
        new Parcelable.Creator<ParcelableBox<?>>() {
    @Override
    public ParcelableBox<?> createFromParcel(Parcel source) {
        return new ParcelableBox<Object>(source);
    }
}

是否可以从 ? 获取类信息使用反射?我无法使用 Object 中的方法在它上面反射(reflect)哪个类放在里面,既不实例化 new ParcelableBox<?>(? element) .包裹不是 E 应该是的类,但我的类是 在那个包裹中,应该是 ? 的类别.


编辑: 嗨,感谢所有的答案:许多用户不明白,我想做什么: 有一个接口(interface)Parcelable ,我认为它作为数据流工作,您可以在其中放置对象成员。你使用类似 parcel.writeString(String string) 的东西或 parcel.writeValue(Object value)存储和parcel.readValue和你把它放进去的方向一样。为了学习,我想将其实现为通用的。所以我希望能够存储到 Parcel,并使用反射从中读取。 因为 CREATOR 是静态的,所以我不能使用 E。

最佳答案

不,这是不可能的。泛型也称为“删除”,因为它们在编译期间从类中删除。泛型是在运行时不存在的编译时特性,因此无法检索此信息。

但是有一个解决方法。创造特殊领域Class<?> type;并把你想要检索的类型放在那里。然后取回它。

顺便说一句,您几乎已经有了这个解决方案。你有一个字段 protected E e; .所以,你可以使用 e.getClass()来确定类型。

关于Java 对未知泛型的反射(reflection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5057080/

相关文章:

c# - 构建和使用通用列表?

java - 创建/写入/读取 Jar 存档外部的文本文件

java - 字节码中 Switch 语句的表示和效率?

Java 到 Kotlin 的转换问题 | - 或/& - 和

android - ZXing:使用UPC+5补充扫描条码

Swift:将泛型类型转换为协议(protocol)

java - 具有泛型类型的 ViewModel

java - 如何解析像 "Fri Oct 31 14:51:47 جرينتش+03:00 2014"这样的日期

java - 使用 aether-api 列出 sonatype Nexus 的可用版本

java - 如何在android java中的imageview上绘制多个点