Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想知道java中一行的含义_Java_Casting_Comparison_Type Conversion - Fatal编程技术网

我想知道java中一行的含义

我想知道java中一行的含义,java,casting,comparison,type-conversion,Java,Casting,Comparison,Type Conversion,下面一行Java代码的含义是什么 class Dog { int size; Dog(int size) { this.size = size; } public boolean equals(Object o) { return this.size == ((Dog) o).size; // im not getting whats the meaning of this line } } 我想知道下面这句话的意

下面一行Java代码的含义是什么

  class Dog {
    int size;

    Dog(int size) {
        this.size = size;
    }

    public boolean equals(Object o) {
        return this.size == ((Dog) o).size; // im not getting whats the meaning of this line
    }
}
我想知道下面这句话的意思:

return this.size== ((Dog)o).size;

这是
equals
方法的一个奇怪实现

它将接受对象
o
,并尝试将其强制转换为
Dog
类型的对象。然后将该狗的大小与该狗的大小进行比较

这是一个有问题的方法,因为如果我们将无法投射的东西传递给狗(例如,套接字),它将抛出ClassCastException,这是一个大的no-no,并且
等于(
。如果无法投射对象进行比较,则必须返回false

我将改写如下:

boolean equals(Object o){
    if(o==null) return false;
    if(this==o) return true;
    if(!o instanceOf Dog) return false;
    return this.size==((Dog) o).size;
}

这就是含义:将当前对象的
size
变量与另一个对象的
size
变量进行相等性比较。结果为
布尔值,作为
equals
方法的结果返回

隐式断言另一个对象的类型相同。
equals
的正确实现在这种情况下不能抛出
ClassCastException
,而是返回
false
。因此此实现不符合
对象#equals
方法的约定

在我看来,这看起来像是开发人员感觉很聪明,并且“找到”了一种简洁地实现
等于
的方法。一个正确但仍然相当简洁的实现如下所示:

return o instanceof Dog && ((Dog)o).size == this.size;

将对象o强制转换为
Dog
并获得
对象的大小
。和
((Dog)o)。size
将返回
int
size。

1)这将对象o强制转换为Dog类 如果通过除狗形物体以外的物体,则它将抛出外壳,但

2) 然后将o的属性与当前的属性大小进行比较
然后它将返回布尔值

假设您有两条狗:dog1和dog2,并且假设您调用dog1.equals(dog2)

this.size在英语中可以翻译为:“这只狗的大小”

==,英文翻译为:“具有与相同的值”

((Dog)o)size,在英语中可以翻译为:“o的大小,o是一只狗”

综合起来: 这只狗的大小与o的大小具有相同的值,o是一只狗

既然您将dog1.equals(dog2)称为dog1,那么“this dog”指的是dog1,“o”指的是dog2,给您:


dog1的大小与dog2的大小具有相同的值,并且dog2是一只狗。

返回此值。大小==((dog)o)。大小;//我没有得到这行的内容}它正在将对象o投射到Dog,并获得sizethanks的向下投射ryt??JavaScript
在哪里?它也没有检查null。@Robadob抱歉,修复了。我想你的代码已经检查null了(在编辑之前)<如果
o
为空=>
o狗的空实例
=>为假…
!空值是问题所在,可以使用
进行修复!(o instanceOf Dog)
@boxed_u_ul True,尽管明确存在空检查实际上更好。@MarkoTopolnik还是很乐意让OP养成习惯,以免在考虑两个对象的情况下,他通过复杂的行走来比较大数据对象\
return o instanceof Dog && ((Dog)o).size == this.size;