Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基类和扩展类之间的相等不能正常工作_Java_Spring_Configuration_Java 8_Equals - Fatal编程技术网

Java 基类和扩展类之间的相等不能正常工作

Java 基类和扩展类之间的相等不能正常工作,java,spring,configuration,java-8,equals,Java,Spring,Configuration,Java 8,Equals,我正在使用Java8和Spring。最近我(对我来说)遇到了一个奇怪的问题。基本上,我有两门课: 1.它是一个基类: public BaseClass { private int variableA; public BaseClass() { /* this is an empty costructor */ } public BaseClass(int a) { this.variableA = a; }

我正在使用Java8和Spring。最近我(对我来说)遇到了一个奇怪的问题。基本上,我有两门课: 1.它是一个基类:

public BaseClass {
    private int variableA;

    public BaseClass() {
        /* this is an empty costructor */ 
    }

    public BaseClass(int a) {
        this.variableA = a;
    }

    /* getter and setter method */

   @Override
   public boolean equals(Object o) {
       if (this == o) {
            return true;
       }
       if (o == null || getClass() != o.getClass()) {
           return false;
       }
       BaseClass that = (BaseClass) o;
       /* (HERE) */
       return variableA == that.variableA;
   }
}
@Configuration
@ConfigurationProperties(prefix = "config")
@RefreshScope //org.springframework.cloud.context.config
public MyClass extends BaseClass {
    private int variableB;

    /* getter and setter method */
}
二,。一个@Configuration类,它扩展了基类:

public BaseClass {
    private int variableA;

    public BaseClass() {
        /* this is an empty costructor */ 
    }

    public BaseClass(int a) {
        this.variableA = a;
    }

    /* getter and setter method */

   @Override
   public boolean equals(Object o) {
       if (this == o) {
            return true;
       }
       if (o == null || getClass() != o.getClass()) {
           return false;
       }
       BaseClass that = (BaseClass) o;
       /* (HERE) */
       return variableA == that.variableA;
   }
}
@Configuration
@ConfigurationProperties(prefix = "config")
@RefreshScope //org.springframework.cloud.context.config
public MyClass extends BaseClass {
    private int variableB;

    /* getter and setter method */
}
我只想检查两个类是否相等,只考虑基类中的变量。示例法

public boolean areTheyEqual(BaseClass a, MyClass b) {
    return a.equals(b);
}
在方法
Areequal
中,类
a
b
已正确填充。当您查看
基类时,等于
到写入
(此处)
的行:在这一点上,我有一些
基类
是从
MyClass
创建的。它不是空指针,但
variableA
等于0(在MyClass中,它被设置为某个值)。我不知道为什么

但是

如果我将方法
更改为:

public boolean areTheyEqual(BaseClass a, MyClass b) {
    return a.equals(new BaseClass(b));
}
一切正常。我真的很好奇为什么会这样。使用
equals
我将@Configuration class MyClass强制转换为Object,然后转换为BaseClass,这是不是有什么问题

编辑1: 例如:

在我的问题中,什么是
等于
实现并不重要(顺便说一句,方法是由Intellij生成的)

我对“良好工作”的定义是: 1.当基类中的
variableA
与myClass中的
variableA
相同时,
equals
返回true
2.如果不是1。然后false

由于给出的信息很少,最可能的原因似乎是您在子类中重新定义了相同的私有变量
variableA
,如:

public class BaseClass {
    private int variableA;

    public BaseClass (int a) {
        this.variableA = a;
    }
}

public class MyClass extends BaseClass {
    private int variableA;

    public MyClass (int a) {
        this.variableA = a;
    }
}

如果这样做,基类的变量将在子类实例中保持为0,但只要查看子类,您仍然会看到它正确地设置了名为
variableA
的变量。如果将其强制转换为超类,基类的变量将变为可见,显示
0

首先,当您实际指的是“对象”或“实例”时,应该停止使用“类”一词。你对这个词的滥用使整个问题很难理解

然后,你得到你想要的。在
equals
实现中,有这样一条语句:

if (o == null || getClass() != o.getClass()) {
    return false;
}
这意味着只有当两个对象属于完全相同的类时,它们才能相等,因此
MyClass
的实例不能等于
BaseClass
的直接实例,该实例不是
MyClass
的实例

如果您想平等地对待
BaseClass
及其子类的所有实例,而不考虑它们的实际类型,那么必须将该语句更改为

if (o == null || ! (o instanceof BaseClass)) {
    return false;
}
if (! (o instanceof BaseClass)) {
    return false;
}
instanceof
运算符接受指定类型的子类的实例。您不需要检查
this
的类型,因为这意味着
基类的这个实例总是
true

请注意,与调用
o.getClass()
不同,
instanceof
也正确处理
null
,因此也可以将语句简化为

if (o == null || ! (o instanceof BaseClass)) {
    return false;
}
if (! (o instanceof BaseClass)) {
    return false;
}
但是使用更简单的形式还是显式的
null
测试是一种编码风格的决定


顺便说一句,当您的意图是所有
基类
实例都具有相同的相等定义时,无论它们的实际(子)类型如何,您都应该使
方法
最终
,以清晰明了。

您能给我们展示一下相等的代码吗我们不能回答这个问题,因为缺少太多的代码,我们不知道你对“工作正常”的定义是什么。“在
MyClass
中,它被设置为某个值”是什么意思?它设置在哪里,如何设置?你的问题完全不清楚。在
基类中显示equals方法请提供一个。请现在查看。在基类中是variableA,在MyClass中是variableB。这里没有重新定义。