java - 避免 Java 类型删除

标签 java templates generics generic-programming type-erasure

有没有一种方法可以避免类型删除并访问类型参数?

public class Foo<T extends Enum<?> & Bar> {
    public Foo() {
        // access the template class here?
        // i.e. :
        baz(T.class); // obviously doesn't work
    }

    private void baz(Class<T> qux) { 
        // do stuff like
        T[] constants = qux.getEnumConstants();
        ...
    } 
}

我需要了解T,并用它做事。是否可能,如果可以,如何在构造函数中或参数以外的任何地方传递类?

编辑:这个问题的主要目的是找出是否有围绕类型删除的任何实用方法

最佳答案

AFACT,没有绕过类型删除的实用方法,因为您不能请求运行时无法访问的内容。当然,假设您同意为每个实现 Bar 接口(interface)的枚举创建通用类的子类是一个实际的解决方法。

enum Test implements Bar {
    ONE, TWO
}

class Foo<T> extends FooAbstract<Test> {
    public Foo() {
        ParameterizedType genericSuperclass =
                (ParameterizedType) getClass().getGenericSuperclass();
        baz((Class<T>) genericSuperclass.getActualTypeArguments()[0]);
    }

    private void baz(Class<T> qux) {
        T[] constants = qux.getEnumConstants();
        System.out.println(Arrays.toString(constants)); // print [ONE, TWO]
    }
}

interface Bar {
}

class FooAbstract<T extends Enum<?> & Bar> {
}

关于java - 避免 Java 类型删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8452893/

相关文章:

java - 在 java 中将输入对话框区域设置更改为希伯来语

django - 在 jinja 模板中切换语言

java - Play 1.2.4 : Rendering XML in template

html - 在 Twitter Bootstrap 的 Carousel 模板中将字幕居中对齐并置于特写图像下方

c# - C# 中 typeof(int) 和 typeof(Int32) 之间的区别可能吗?

java - orientdb使用Index.get()查询复合索引

java - 在Gradle中使用 cucumber 时在运行时添加必要的库文件

java - 是否可以在 Hibernate 中通过 OneToOne 关系映射父类(super class)和子类?

c - 通用堆栈不推送或弹出值

java - 在泛型类中实现数组列表的 Add 方法