java中的类等价

时间:2014-06-08 04:54:07

标签: java inheritance

一个小小的打嗝引发了我一个基本的问题。我打算在以下案例中检查班级对等(学术好奇心 - 请不要指示我instanceofisinstance):

public class staticChild extends staticParent{
    ....
        public static void main(String[] args){
        staticChild thisobj=new staticChild();
        System.out.println(thisobj.getClass()==staticParent.class);
    }

}

这会产生编译错误:

error: incomparable types: Class<CAP#1> and Class<staticParent>
                System.out.println(thisobj.getClass()==staticParent.class);
 where CAP#1 is a fresh type-variable: CAP#1 extends staticChild from capture of ? extends staticChild
  1. 这是什么意思?
  2. 类型和类之间有什么区别(具体到这个上下文 - staticchild的类型和类是什么)?
  3. 如何摆脱编译错误?

4 个答案:

答案 0 :(得分:2)

由于thisobj被声明为staticChild类型,因此表达式为:

thisobj.getClass()

返回Class<? extends staticChild>类型的对象。您正在尝试将其与类型为Class<staticParent>的对象进行比较,但编译器无法匹配泛型类型参数。它知道staticParent无法扩展staticChild所以它无法分配给?中的Class<? extends staticChild>

有几种方法可以消除错误。例如,您可以将thisobj声明为Object类型(甚至类型为staticParent)。

但请注意,测试将始终失败。

答案 1 :(得分:1)

  1. 这意味着您要比较的两个对象永远不能相等,因为它们的类型不能相互转换。根据{{​​3}},
  2.   

    如果无法转换类型,则为编译时错误   通过转换转换将操作数转换为另一个的类型   (§5.5)。两个操作数的运行时值必然是   不相等的。

    1. 在此上下文中,类型和类之间没有区别。

    2. 不要尝试比较两个不可相互转换的对象。在这种情况下,您要将Class<CAP#1>Class<staticParent>进行比较。但是,如果您想“修复”错误,则可以使用.equals代替,并了解它始终会返回false

      System.out.println(thisobj.getClass().equals(staticParent.class));
      

答案 2 :(得分:1)

编译器已经足够聪明,可以说类不等同。它假设你正在编写一个通常的程序,而不是解决学术任务,并尽力提供帮助。

如果您仍然需要手动执行此操作&#34;由于学术好奇心&#34;,请将它们分配给类型为Class的常规变量:

Class a = staticChild.class;
Class b = staticParent.class;

if (a == b) // false

(将显示&#34;原始类型&#34;警告但应该编译)。

Object x = a.newInstance();
Object y = b.newInstance();

休息取决于你。

答案 3 :(得分:0)

这意味着您的代码中存在错误。

错误表示您的类型不兼容。是的,您可以从错误消息中看到它,但是不兼容的类型。您正在通过“==”比较两个类。

如果您要检查thisobj是否是staticParent的实例,那么您应该使用:

System.out.println(thisobj instanceof staticParent);

但具体而言,错误是因为您正在基于两个永远不会相等的类运行true / false的比较。