java - 为什么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。迈克尔,任何帮助将不胜感激。
编辑:感谢有用的评论,我想为我的问题提供一些背景信息。我在参加有类似问题的测试后问它。它包括几个类,其中一个问题包括几个语句,这些语句可以运行并产生输出,也可以在运行时或编译时失败。其中之一是关于比较上面示例中的两个对象。我认为这样做没有错,你会得到错误的,但这不是问题。当然,在现实生活中,如果您在运行时之前知道类型,则没有理由这样做,但由于这是一个测试,这似乎是可能的。
解决方案
如果您考虑一下,您的示例完全是多余的,您甚至无需运行代码就知道这两个对象不可能具有可比性,因为它们属于 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()
方法,它允许您比较对象内容而不是引用。
推荐阅读
- ios - IOS:AccessoryButtonTapped 导致立即重新加载 tableview 是正常行为吗?
- java - 使用 Lombok 访问私有内部类
- .net-core - 作为 Windows 服务运行时,在 .net core 3 的工作服务中未调用 StopAsync
- r - 循环多个数据帧到ggplot
- java - 插入新行时出现休眠错误:CannotCreateTransactionException:无法打开 JPA EntityManager 进行事务处理
- d3.js - D3鼠标光标周围没有出现
- netlogo - 限制我列表中所有值的小数
- world-of-warcraft - 玩家 'Helias' (1) 发现未知区域(x: y: z: map: )
- c# - 使用 .NET 系统将字符数组转换为字符串?
- php - 我想从 PDO 中的数据库中从树枝中获取多个对象的数据