如何为 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);
}
这是我的复数中的一段代码 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);
}