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

JRR*_*JRR 0 java generics types

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

class Foo<T> {
  void bar () { 
    if (T instanceof Serializable)   // does not compile
      ...
  } 
}
Run Code Online (Sandbox Code Playgroud)

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

rua*_*akh 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)) {
      ...
    }
  } 
}
Run Code Online (Sandbox Code Playgroud)

  • @JanDvorak:事实上,根据*Java语言规范*,决定*不*在幕后做这件事,是涉及Java编程类型系统的最有争议的设计决策之一语言." [第4.7节"可再生类型"](http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7)解释了为什么他们这样做了.简而言之,这是因为他们希望新代码能够继续使用预编译的旧代码. (2认同)