避免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