获取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的代码,因为其中一个需要另一个所禁止的。