避免Java类型擦除

Chr*_*ell 9 java generics templates 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();
        ...
    } 
}
Run Code Online (Sandbox Code Playgroud)

我需要知道T并用它做事.是否可能,如果是这样,如果不在构造函数中传递类或参数之外的任何地方,如何才能完成?

编辑:这个问题的主要目的是找出是否有任何关于类型擦除的实用方法.

San*_*rma 6

AFACT,没有关于类型擦除的实用方法,因为你不能要求运行时无法访问的东西.当然,假设您同意对实现Bar接口的每个枚举进行子类化泛型类是一个实际的工作.

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> {
}
Run Code Online (Sandbox Code Playgroud)

  • +1是的 - 如果你更喜欢子类化传递`Class`对象,这是另一种基于反射的选择. (2认同)