在java中获取实例化的类型变量

时间:2013-02-23 20:41:22

标签: java generics types

我想检查泛型类的实例化类型是否具有某些属性,例如:

class Foo<T> {
  void bar () { 
    if (T instanceof Serializable)   // does not compile
      ...
  } 
}

我想知道通用信息在运行时是否完全丢失了?这是否意味着没有办法完成我想做的事情?

2 个答案:

答案 0 :(得分:6)

  

这是否意味着没有办法完成我想做的事情?

你可以写:

class Foo<T> {
  private final Class<T> clazz;

  Foo (final Class<T> clazz) { // require creator to supply a Class<T>
    this.clazz = clazz;
    if (clazz == null) {
      throw new NullPointerException();
    }
  }

  void bar () { 
    if (Serializable.class.isAssignableFrom(clazz)) {
      ...
    }
  } 
}

答案 1 :(得分:2)

你是对的,generic type information在运行时丢失了。它被称为Type Erasure。编译器将删除所有泛型类型并在运行时执行强制转换(如有必要)。和所有