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

获取java中的实例化类型变量,java,generics,types,Java,Generics,Types,我想检查泛型类的实例化类型是否具有某些属性,例如: class Foo<T> { void bar () { if (T instanceof Serializable) // does not compile ... } } class-Foo{ 空条(){ 如果(T instanceof Serializable)//未编译 ... } } 我想知道通用信息是否在运行时完全丢失了?这是否意味着无法完成我想做的事情?你说得对,泛型类型信息在

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

class Foo<T> {
  void bar () { 
    if (T instanceof Serializable)   // does not compile
      ...
  } 
}
class-Foo{
空条(){
如果(T instanceof Serializable)//未编译
...
} 
}

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

你说得对,
泛型类型信息在运行时丢失。编译器将删除所有泛型类型,并在运行时执行强制转换(如果必要)。所有的

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

你可以写:

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)) {
      ...
    }
  } 
}
class-Foo{
私人期末班;
Foo(最终类clazz){//要求创建者提供一个类
this.clazz=clazz;
if(clazz==null){
抛出新的NullPointerException();
}
}
空条(){
if(Serializable.class.isAssignableFrom(clazz)){
...
}
} 
}

“我想知道泛型信息在运行时是否完全丢失?”--是的,确切地说,即使类型参数在运行时没有被删除,您的代码仍然不会编译,因为
instanceof
的左侧参数必须是引用,而不是类型。例如,您不能写入对象的
字符串实例
可序列化
不是您想要在接口类型上断言的东西,即使是静态的。它是实现类型的属性,因此也是实例的属性。实际上,您可以使用反射来实现这一点。虽然ruakh下面的答案没有错,并且代表了“经典”的方法,但我建议阅读,而且编译器也应该在幕后这样做:-(@JanDvorak:事实上,根据Java语言规范,不在幕后这样做的决定是“最[…]的决定之一”涉及Java编程语言类型系统的有争议的设计决策。”解释了他们为什么这么做。简言之,这是因为他们希望新代码能够继续与预编译的旧代码一起工作。读起来不错,但我仍然看不到允许t的实例带来的任何不兼容。我同意Jan。我认为JLS应该在语言中允许t的实例。@JanDvorak:有什么不允许的参见?Java-5之前的
列表
禁止客户端提供任何幕后
魔术(因为这还不存在),因此如果Java-5之后的
列表
需要这种魔术(为了支持
t.Class
t的实例
,等等),那么就有一个基本的不兼容性。不可能编译同时使用
List
s的代码,因为其中一个需要另一个所禁止的。