6

我试图使用 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>,如果我用 .initilize b 就可以了Object b= new child();。谁能告诉我它们之间有什么区别?

提前致谢。

4

3 回答 3

6

由于在 Java 5 中引入了泛型,java.lang.Class该类在它所代表的类型上是泛型的。这使得通过它们无需强制转换即可构造对象Class,并启用其他有用的习语。

这就是为什么编译器会变得太聪明,并看到它能够在编译时完全评估表达式:你的表达式总是false. 编译器会为您提供类型兼容性错误,但这是表达式为编译时常量的直接结果。

避免这种情况的一种方法是使用java.lang.Objectas 类型。一旦你这样做了,编译器就不能再getType精确地评估 's 结果的类型,从而避免错误。

解决此问题的另一种方法是将返回类型转换为非泛型Class

System.out.println(((Class)b.getClass())==parent.class);

或使用非泛型的中间变量:

Class bClass = b.getClass();
System.out.println(bClass==parent.class);
于 2013-08-26T02:22:55.140 回答
1

该错误消息基本上意味着编译器可以在编译程序时判断该相等性检查的答案总是错误的。因为它知道子类和父类永远不可能相等,所以它拒绝编译代码。

于 2013-08-26T02:24:11.693 回答
-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));
于 2013-08-26T03:49:38.840 回答