首页 > 解决方案 > 为什么Java == 运算符不能用于两个不相关类型的不同对象?

问题描述

据我了解,java 中的 == 运算符检查两个引用是否指向内存中的同一个对象。如果是这种情况,当我在两个不同的对象上使用它时,它们都是不同类的实例,我应该得到错误。我对为什么从以下代码中收到编译器错误感到困惑:

public class HelloWorld{

    public static class A {}
    
    public static class B {}

     public static void main(String []args){
        A a = new A();
        B b = new B();
        System.out.println(a == b);
     }
}

我得到的错误是:

HelloWorld.java:11: error: incomparable types: A and B
        System.out.println(a == b);
                             ^
1 error

如果我将其中一个转换为对象,它会运行并返回 false。我只是不明白为什么我需要转换为对象。两个类都是 Object 类型,因为无论如何所有类都继承 Object。迈克尔,任何帮助将不胜感激。

编辑:感谢有用的评论,我想为我的问题提供一些背景信息。我在参加有类似问题的测试后问它。它包括几个类,其中一个问题包括几个语句,这些语句可以运行并产生输出,也可以在运行时或编译时失败。其中之一是关于比较上面示例中的两个对象。我认为这样做没有错,你会得到错误的,但这不是问题。当然,在现实生活中,如果您在运行时之前知道类型,则没有理由这样做,但由于这是一个测试,这似乎是可能的。

标签: java

解决方案


如果您考虑一下,您的示例完全是多余的,您甚至无需运行代码就知道这两个对象不可能具有可比性,因为它们属于 2 个不同的类,编译器只是通过说出它们来节省您一些时间无与伦比的前面。

仅当您不知道类型是什么,或者您知道类型但它们属于同一类时,像这样比较相等性才有用。例如:

public class HelloWorld {

    public static class A {}

    public static class B {}
    
    public static void compare(Object a, Object b) {
        boolean comparison = a == b;
        System.out.println(comparison);
    }

    public static void main(String []args) {
        A a = new A();
        B b = new B();
        compare(a, b);
    }
}

假设在这个例子中你只知道比较方法,那么相等方法就有意义了,因为你事先不知道类型,它们只是Objects.

旁注,当比较像这样的对象时,您更有可能想要使用该.equals()方法,它允许您比较对象内容而不是引用。


推荐阅读