为什么Java在.equals(Object)方法中不会自动装箱int到Integer?

4

我正在处理一些Java类,想要重写.equals(Object)方法来测试我的类的整数变量。但是我很惊讶地发现,它报错说我不能使用原始类型int,而我确定在Java文档中说编译器会自动将原始类型转换为包装类型用于方法。

public boolean equals(Object o)
{
    if (!(o instanceof myClass))
        return false;
    myClass mc = (myClass)o;
    return (this.myInt.equals(mc.getMyInt()));
}

我猜想,当方法期望一个 Integer 时,它会自动装箱,但当它期望一个 Object(你可能知道是一个 Integer)时,它不会。 - Richard Tingle
5
自动装箱适用于赋值操作(包括参数赋值)。您正在尝试在this.myInt.equals(...)中使用它,其中myInt是一个原始类型。这里无法使用自动装箱。 - Jim Garrison
2
假设 getMyInt() 返回 int,那么 this.myInt() == mc.getMyInt() 在这里是可以的。 - jdphenix
正如@Jim所说,只有赋值才涉及到自动装箱。没有像Scala中那样允许您期望的“隐式”概念;) - Mik378
2
我确定 Java 文档中说编译器会自动将基本类型转换为包装类型,以便在方法中使用。但实际上并不是这样的。请查看文档真正的说明。 - user207421
2个回答

5
我认为“this.myInt”是一个int而不是一个Integer。自动装箱将在参数中起作用。以下是一些示例。
int a = 1;
int b = 1;
Integer c = 1;
Integer d = 1;

a.equals(b); // doesnt work as equals isn't define on int
c.equals(b); // work, c is an Integer/Object and b is autoboxed
c.equals(d); // work, both are Integer/Object

1
你可以直接使用return (this.myInt==mc.getMyInt());equals()方法仅适用于对象。

这并没有明确定义。实际上,它只适用于 int 很小的情况。即使在这种情况下,将 int 与 Integer 进行比较可能会令人惊讶。 - Jonatan Cloutier
请看:https://dev59.com/jILba4cB1Zd3GeqPi8Ol#25468864 - Jonatan Cloutier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接