如何为 Java 中的自定义复数 class 定义等于函数?

How do I define an equals function for a custom complex numbers class in Java?

这是我的复数中的一段代码 class:

public class complex {
    private double re;
    private double im;

    public complex(double real, double imag) {
        re = real;
        im = imag;
    }

    public Boolean equals(complex b) {
        complex a = this;
        return a.re==b.re && a.im==b.im;
    }

    public Boolean equals(double alpha){
        complex a = this;
        return a.re==alpha && a.im==0;
    }
    ...
}

这就是我尝试使用它的目的:

public class cubic_cardano {
    public static void solveCubic(complex a, complex b, complex c, complex d){
        if (a==b && b==c && c==d && d==0) {
            ...
        }
    }
    ...
}

将复数与复数进行比较工作正常,而将复数与双精度数进行比较会出错:

Incompatible operand types complex and int

可能是什么原因,我怎样才能让它发挥作用?

基本上:不,你不能。 Java 不支持“运算符重载”,这正在改变运算符为您自己 类 工作的方式。 您只需要使用 complexA.equals(complexB);

关于运算符重载Why doesn't Java offer operator overloading?

您不能使用 equals== 来比较两个不相关类型的对象。相反,您应该与值为零的 Complex 进行比较:

    public static void solveCubic(Complex a, Complex b, Complex c, Complex d){
        if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(new Complex(0, 0))) {
            //...
        }
    }

p.s。正如其他人在评论中指出的那样,您的 Complex class 还有其他几个问题。这是我使用的版本:

import java.util.Objects;

public class Complex {
    private double re;
    private double im;

    public Complex(double real, double imag) {
        re = real;
        im = imag;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Complex other = (Complex) o;
        return re == other.re && im == other.im;
    }

    @Override
    public int hashCode() {
        return Objects.hash(re, im);
    }
}

您需要定义签名,以便它正确地重载对象方法 equals 和 hashCode。此外,您的类名“complex”应大写为“Complex”。

您的实现仅为“复杂”类型的参数定义了 equals,但它需要接受 Object 参数。这有点令人困惑,但是 Java 的定义方式你需要这样做。

以与您的 equals 方法兼容的方式重写 hashCode 方法也很重要。否则,依赖于 equals 的东西,比如 Map,将无法正常工作。

@Override
public boolean equals (Object c)
{
    if (c != null)
    {
        if (c instanceof complex)
        {
            final complex cc = (complex)c;
            return cc.re == re && cc.im == im;
        }
    }
    return false;
}

@Override
public int hashCode ()
{
    return Double.hashCode (re) + Double.hashCode(im);
}