Java:为什么需要在equals()中类型转换为instanceof()?是供参考还是更少的代码?

问题描述 投票:0回答:1

这里是Java新手,我有一个基本问题,其他线程或文档中先前的回答对此回答只有一半,但我仍然不完全了解该机制,我想确保自己涵盖了基础知识(底部代码,问题在中间)。

[基本上,我重写equals()方法来检查两个MyDate对象是否具有相同的日期。我执行一个instanceof检查o对象是否是MyDate对象,然后键入将临时对象专门投射到MyDate对象o,然后比较日期。 当它已经属于MyDate类时,为什么将temp变量类型转换为o的MyDate类?]

  1. 您是否使用temp变量作为您要运行equals()比较的对象的简单引用?因为您使用equals()作为比较MyDate.equals(MyOtherDate),所以在代码中,如果我不指定变量来保存引用,则会出现各种错误(temp无法解析为变量,类型不匹配等,基本上,编译器是“请确保在哪里查看,除非您编写更多代码。

2a。其他一些线程则表示,其结果是,instanceof检查实例是否来自类时,它检查base类,但不检查子类。之所以进行类型转换,是因为您要专门告诉编译器检查该特定对象(从一般对象到特定对象的类型转换)。注意:这可能是特定于版本和口味的类型问题,我对类似问题有不同的回答。

2b。强制转换会更改引用,而不是对象本身。因此,如果对象来自相同的类,但来自不同的子类,则它不会在运行时而不是在编译时失败。而且我不会收到ClassCastException吗?

public boolean equals(Object o) {
            if (o instanceof MyDate) {
                MyDate temp = (MyDate) o;
                if ((temp.day == day) && (temp.month == month) && (temp.year == year)) {
                    return true;
                }
            } 
            return false;
        }

这里是Java新手,我有一个基本问题,其他线程或文档中的先前回答一半不能回答,但我仍然不完全了解该机制,我想确定自己涵盖了...]]] >

Java编译器无法将对象“ o”的类型类理解为MyDate。发生这种情况是因为您收到了Object类型的参数,因此它将作为对象读取。为了访问已知类型MyDate的参数的方法和属性,您需要告诉编译器这是MyDate类型的对象。这是编译器将要了解您正在执行的操作的方式。现在,让我们看看另一个视图。

Java中的每种类型都扩展了Object类型,这意味着每次编写类时,都隐式地扩展了Object公共/受保护的属性和行为。这就是为什么您要“覆盖”属于equals类型的方法Object。好吧,当您在两个对象之间进行比较时,必须首先检查它们是否都属于同一类型,就像您在示例中所做的那样:if (o instanceof MyDate) { ... }以确保o的类型为MyDate。但是在这一点上,由于您没有将“ o”强制转换为“ MyDate”类型,因此您将无法访问MyDate的特定属性或方法。所以想一想,如果我有一个扩展了类A的类B,我将能够在A内访问B的公共方法和属性,但是我不能在B上做同样的事情,因为B可以看不到树下正在发生什么。你遵循吗?

希望我能回答您的疑问。

java types casting equals instanceof
1个回答
0
投票

Java编译器无法将对象“ o”的类型类理解为MyDate。发生这种情况是因为您收到了Object类型的参数,因此它将作为对象读取。为了访问已知类型MyDate的参数的方法和属性,您需要告诉编译器这是MyDate类型的对象。这是编译器将要了解您正在执行的操作的方式。现在,让我们看看另一个视图。

Java中的每种类型都扩展了Object类型,这意味着每次编写类时,都隐式地扩展了Object公共/受保护的属性和行为。这就是为什么您要“覆盖”属于equals类型的方法Object。好吧,当您在两个对象之间进行比较时,必须首先检查它们是否都属于同一类型,就像您在示例中所做的那样:if (o instanceof MyDate) { ... }以确保o的类型为MyDate。但是在这一点上,由于您没有将“ o”强制转换为“ MyDate”类型,因此您将无法访问MyDate的特定属性或方法。所以想一想,如果我有一个扩展了类A的类B,我将能够在A内访问B的公共方法和属性,但是我不能在B上做同样的事情,因为B可以看不到树下正在发生什么。你遵循吗?

© www.soinside.com 2019 - 2024. All rights reserved.