我试图使用getClass()方法并使用以下代码:
class parent{}
class child extends parent{}
public class test {
public static void main(String[] args){
child b= new child();
System.out.println(b.getClass()==parent.class);
}
}
我收到了一个编译错误Incompatible operand types Class<capture#1-of ? extends child> and Class<parent>
,如果我用Object b= new child();
初始化b就没问题。谁能告诉我他们之间有什么区别?
提前致谢。
答案 0 :(得分:6)
自Java 5中引入泛型以来,java.lang.Class
类在它所代表的类型上是通用的。这样就可以通过Class
构建对象而不需要演员,并启用其他有用的习语。
这就是编译器过于聪明的原因,并且看到它能够在编译时完全评估表达式:表达式总是false
。编译器为您提供类型兼容性错误,但这是表达式编译时常量的直接结果。
避免这种情况的一种方法是使用java.lang.Object
作为类型。一旦这样做,编译器就不能再精确地评估getType
的结果类型,从而避免错误。
解决此问题的另一种方法是将返回类型转换为非泛型Class
System.out.println(((Class)b.getClass())==parent.class);
或使用非泛型的中间变量:
Class bClass = b.getClass();
System.out.println(bClass==parent.class);
答案 1 :(得分:1)
该错误消息基本上意味着编译器可以告诉编译程序什么时候该等式检查的答案将始终为false。因为它知道子类和父类永远不能相等所以它拒绝编译代码。
答案 2 :(得分:-1)
如果你想判断b.getClass()是否继承了parent.class,我建议使用这个方法:
public static boolean judgeInherit(Class targetClass,Class supClass){
Class supperClass = targetClass;
while(supperClass !=null){//if have supper class
if(supperClass == supClass){
system.out.println(targetClass.getName() + " inherit "+supClass.getName());
return true;
}
supperClass = supperClass.getSupperclass();
}
return false;
}
并致电
system.out.println(judgeInherit(b.getClass(),parent.class));