Java 基类和扩展类之间的相等不能正常工作
我正在使用Java8和Spring。最近我(对我来说)遇到了一个奇怪的问题。基本上,我有两门课: 1.它是一个基类: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; }
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。这里没有重新定义。