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

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

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

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

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;
        }
usb333 回答:Java:为什么需要在equals()中类型转换为instanceof()?是供参考还是更少的代码?

Java有两个相关但分开的概念:表达式 type runtime-type

这些概念在某种程度上是兼容的;如果表达式的类型为 if __name__ == '__main__': try: for i in range(150): solenoid_on(channel) # |~ in this section,i would like to repeat X amount time.sleep(1) # Sets lag time | of times,have a set number of "run time" say... solenoid_off(channel) # | 150 times..or do i just copy and paste this block time.sleep(3) # Sets run time | 150 times? print("Iteration",i," is done") GPIO.cleanup() ,则在对该表达式求值时,将获得对运行时类型为MyDateMyDate的子类的对象的引用,或者得到空引用,否则会出现异常或无限循环或其他情况。但是这些概念是分开的,即使您的运行时类型很好,有时您也需要向编译器提供有关这些类型的其他信息。

>当temp变量已经属于MyDate类时,为什么将temp变量键入o的MyDate类?

变量MyDate的类型为o,而不是类型为Object永远。它恰好包含对运行时类型为MyDate(或MyDate的子类)的对象的引用,但这并不影响MyDate的类型。因此,您编写o来创建一个具有相同值(因此具有相同的运行时类型)和所需类型的表达式。

如果编译器更聪明,它可能会将(MyDate)o语句中的o视为类型为MyDate,因此您不需要强制转换;但是当前的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无法看到树下发生的事情。你遵循吗?

希望我能回答您的疑问。

本文链接:https://www.f2er.com/2775247.html

大家都在问