编程语言
首页 > 编程语言> > 避免Java类型擦除

避免Java类型擦除

作者:互联网

有没有办法可以避免类型擦除并获得类型参数的访问权限?

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接口的每个枚举进行子类化泛型类是一个实际的工作.

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> {
}

标签:generic-programming,java,templates,generics,type-erasure
来源: https://codeday.me/bug/20191001/1837991.html