首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免Java类型擦除

避免Java类型擦除
EN

Stack Overflow用户
提问于 2011-12-09 23:16:12
回答 5查看 5.9K关注 0票数 9

是否有一种方法可以避免类型擦除并访问类型参数?

代码语言:javascript
复制
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,并用它来做一些事情。这是可能的吗?如果是这样的话,在不传入构造函数中的类或参数之外的任何地方,如何才能做到呢?

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-12-10 20:12:07

AFACT,没有实用的方法可以绕过类型擦除,因为您不能要求运行时无法访问的东西。当然,假设您同意为实现Bar接口的每个枚举划分泛型类是一项实际工作。

代码语言:javascript
复制
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> {
}
票数 6
EN

Stack Overflow用户

发布于 2011-12-09 23:24:55

如果您愿意/能够将类令牌传递给构造函数:

代码语言:javascript
复制
public Foo(Class<T> clazz) {
    baz(clazz);
}

private void baz(Class<T> qux) {
    // ...
}

这样,您可以使用Class.newInstance()生成T类型的对象,尝试使用Class.cast()将任意对象转换为T,等等。

你打算用baz()做什么?

票数 2
EN

Stack Overflow用户

发布于 2011-12-10 19:30:12

正如pholser在他的回答中所指出的,实现这一目标的唯一方法是传递表示T类型的T对象。正是因为有了类型擦除,像T.class这样的东西才不可能实现,因为T在运行时之前被删除了。

您似乎不愿传入Class对象,但这是使用getEnumConstants()方法的唯一方法。下面是一个完整的示例:

代码语言:javascript
复制
public class Foo<T extends Enum<?> & Bar> {

   final Class<T> clazz;

   public Foo(Class<T> clazz) {

      this.clazz = clazz;
   }

   public void baz() {

      T[] constants = clazz.getEnumConstants();

      System.out.println(Arrays.toString(constants));
   }

   public static void main(String[] args) {

       new Foo<MyEnum>(MyEnum.class).baz(); //prints "[A, B, C, D]"
   }
}

public interface Bar { }

public enum MyEnum implements Bar { A, B, C, D; }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8452893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档