Java 抽象对象之间的比较会产生不可靠的错误

Java 抽象对象之间的比较会产生不可靠的错误,java,abstract-data-type,Java,Abstract Data Type,尽管两个对象是同一个对象,但这会打印false。将返回this==n更改为返回this.intType==n.intType会产生错误“找不到符号:变量intType,位置:类型编号的变量n” 我对ADT还相当陌生,并且还在努力解决这个问题,所以如果这是一个简单的问题,请原谅。但是,我不知道为什么它不起作用,也不知道为什么我不能引用n.intType,但我可以this.intType 您的类是NumbersType而不是Numbers,因此您应该在equals方法中键入强制转换a和b。这就是为什

尽管两个对象是同一个对象,但这会打印false。将
返回this==n
更改为
返回this.intType==n.intType
会产生错误“找不到符号:变量intType,位置:类型编号的变量n”

我对ADT还相当陌生,并且还在努力解决这个问题,所以如果这是一个简单的问题,请原谅。但是,我不知道为什么它不起作用,也不知道为什么我不能引用
n.intType
,但我可以
this.intType

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

  • 键入cast后,equals方法应该比较对象的
    intTypes
    ,而不是直接引用。这就是它不起作用的原因

  • 您的命名有点混乱,我建议您总体上研究多态性

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

  • 键入cast后,equals方法应该比较对象的
    intTypes
    ,而不是直接引用。这就是它不起作用的原因

  • 您的命名有点混乱,我建议您总体上研究多态性

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

  • 键入cast后,equals方法应该比较对象的
    intTypes
    ,而不是直接引用。这就是它不起作用的原因

  • 您的命名有点混乱,我建议您总体上研究多态性

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

  • 键入cast后,equals方法应该比较对象的
    intTypes
    ,而不是直接引用。这就是它不起作用的原因


  • 您的命名有点混乱,我建议一般研究多态性。

    intType
    是在
    NumbersType
    上声明的,但是
    n
    是一个
    Numbers
    。所以你不一定能比较它们

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

    但首先有一个附带的问题,那就是你宣布了一个超负荷的。您可能打算声明一个覆盖,这是另一回事。为了回答这个问题,我将展示两者的一个示例,并将重载命名为不同的名称

    下面是修改后的界面:

    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);
    }
    
    既然可以检索int,那么就可以在实现类中比较它们了

    public interface Numbers {
        public int getIntType();
        public boolean isIntTypeEqual(Numbers n);
    }
    
    您可能需要阅读:

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


    另一个复杂问题是根据接口声明equals:因为equals必须是对称的,所以实现必须以相同的方式覆盖它。否则合同将被破坏。

    intType
    NumbersType
    上声明,但
    n
    是一个
    Numbers
    。所以你不一定能比较它们

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

    但首先有一个附带的问题,那就是你宣布了一个超负荷的。您可能打算声明一个覆盖,这是另一回事。为了回答这个问题,我将展示两者的一个示例,并将重载命名为不同的名称

    下面是修改后的界面:

    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);
    }
    
    既然可以检索int,那么就可以在实现类中比较它们了

    public interface Numbers {
        public int getIntType();
        public boolean isIntTypeEqual(Numbers n);
    }
    
    您可能需要阅读:

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


    另一个复杂问题是根据接口声明equals:因为equals必须是对称的,所以实现必须以相同的方式覆盖它。否则合同将被破坏。

    intType
    NumbersType
    上声明,但
    n
    是一个
    Numbers
    。所以你不一定能比较它们

    现在,您可以做的一件事是在接口上创建一个方法来检索一些值。我说“some”值而不是“the”值,因为其他
    数字可能是其他实现。这是接口的一个重要方面。如果您有一个
    Numbers
    ,您无法知道它实际上是一个
    NumbersType
    。(您可以通过
    instanceof
    来了解这一点,但这不是编写接口实现的好方法