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

时间:2014-03-09 01:26:00

标签: java abstract-data-type

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 == n更改为return this.intType == n.intType会产生错误“无法找到符号:变量intType,location:类型为数字的变量n”。

我是ADT的新手并且还在绕过它,所以请原谅我这是一个简单的问题。我不确定为什么它不起作用,为什么我不能引用n.intType但我可以this.intType

2 个答案:

答案 0 :(得分:2)

intTypeNumbersType上宣布,但nNumbers。所以你不一定能比较它们。

现在,您可以做的一件事是在接口上创建一个检索某个值的方法。我说'some'值而不是'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必须是对称的,实现必须相同地覆盖它。否则合同就会破裂。

答案 1 :(得分:1)

  1. 您的课程为NumbersType而不是Numbers,因此您应该在等号方法中输入cast a和b。这就是你不能做n.intType

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

  4. 你的命名有点令人困惑,我建议一般研究多态性。