【问题标题】:Why doesn't Java autobox int to Integer for .equals(Object) method?为什么 Java 不自动将 int 转换为 .equals(Object) 方法的整数?
【发布时间】:2025-12-20 07:30:06
【问题描述】:

我正在研究一些 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 时(你可能知道它是一个 @ 987654325@) 不会
  • 自动装箱适用于分配(包括参数分配)。您正在尝试在this.myInt.equals(...) 中使用它,其中myInt 是一个原语。这里没有可用的自动装箱。
  • 假设getMyInt() 返回intthis.myInt() == mc.getMyInt() 在这里很好
  • 正如@Jim 所说,只有分配与自动装箱有关。在 Scala 中没有 implicit 的概念可以满足您的期望;)
  • “我确信它在 java 文档中说过编译器会自动将原始类型自动装箱到方法的包装器类型中。”它没有。看看它到底说了些什么。

标签: java autoboxing


【解决方案1】:

我认为“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

【讨论】:

    【解决方案2】:

    您可以使用 return (this.myInt==mc.getMyInt());equals() 方法只为对象定义。

    【讨论】:

    • 这个没有明确定义。事实上,它只有在 int 很小的情况下才会起作用。甚至在将 int 与 Integer 进行比较时,它也可能令人惊讶。