繁体   English   中英

抽象对象之间的比较产生了奇怪的错误

[英]Comparison between abstract objects yields wonky error

Numbers a,b;
a = new NumbersType(1);
b = new NumbersType(1);
System.out.println(a.equals(b));

public class NumbersType implements Numbers {
    int intType;
    public NumbersType (int q) {
        this.intType = q;
    }
    public boolean equals(Numbers n) {
        return this == n;
    }
}

public interface Numbers {
    public boolean equals(Numbers n);
}

尽管两个对象都是同一对象,但此打印结果为false。 更改return this == nreturn this.intType == n.intType产生错误“找不到符号:变量intType,位置:类型为Numbers的变量n”。

我对ADT相当陌生,但仍然可以解决这个问题,如果这是一个简单的问题,请原谅。 我不确定为什么它不起作用,为什么我不能引用n.intType但我可以this.intType

intTypeNumbersType上声明,但nNumbers 因此,您不必将它们进行比较。

现在,您可以做的一件事就是在接口上创建一个方法来检索一些值。 我说“一些”值而不是“ the”值,因为其他Numbers可能是其他一些实现。 这是接口的重要方面。 如果您有Numbers ,则无法知道它实际上是一个NumbersType (您可以使用instanceof发现这一点,但这不是编程接口实现的好方法。接口的声明应完全指定其交互。)

但是首先存在一个附带问题,即您声明Object#equals的重载。 您可能打算声明覆盖,这是另一回事。 就我的回答而言,我将展示两个示例,并为重载命名不同的名称。

现在是修改后的界面:

public interface Numbers {
    public int getIntType();
    public boolean isIntTypeEqual(Numbers n);
}

现在可以检索int了,可以在实现类中对其进行比较。

public class NumbersType
implements Numbers {
    private int intType;

    public NumbersType(int intType) {
        this.intType = intType;
    }

    @Override
    public int getIntType() {
        return intType;
    }

    @Override
    public boolean isIntTypeEqual(Number n) {
        return intType == n.getIntType();
    }

    // overriding hashCode because we are overriding equals
    @Override
    public int hashCode() {
        return intType;
    }

    @Override
    public boolean equals(Object o) {
        if(!(o instanceof Numbers))
            return false;

        return isIntTypeEqual((Numbers)o);
    }
}

您可能需要阅读:

如果您只是在学习这些知识,那么equals可能不是您应该尝试实现的方法。 这是契约性的,容易出错。

另一个复杂的问题是在接口方面声明了equals:因为equals必须是对称的,所以实现必须相同地重写它。 否则,合同将被破坏。

  1. 您的类是NumbersType而不是Numbers ,因此您应该在equals方法中键入强制转换a和b。 这就是为什么您不能执行n.intType

  2. 键入intTypes后,您的equals方法应该比较对象的intTypes ,而不是直接引用。 这就是为什么它不起作用的原因。

您的命名有些混乱,我建议您一般学习多态性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM