通过抽象 class 覆盖 equals 方法并将其设置为抽象,因此如果任何 class 扩展,它们必须实现
Overriding equals method by a abstract class and set it as abstract so if any class extends, they must implement
我正在尝试构建一个抽象 class/interface 来覆盖已经存在的方法并将它们设置为抽象。这可能吗?
代码示例:
public abstract class Box {
@Override
public abstract boolean equals(Object o);
}
或
public interface Box {
@Override
boolean equals(Object o);
}
上面的class和接口的功能应该是一样的,但这是否意味着都重写了Object equals方法?即使我将其设置为抽象?
这项工作也是如此:
public class Tea extends Box {
@Override
public boolean equals(Object o) {
// TODO Auto-generated method stub
return false;
}
}
首先,接口不会覆盖方法。因此,您不能通过向接口添加 equals
方法来覆盖 Object
中的 equals
。相反,接口可以被认为是契约,它们保证任何实现它们的非抽象 class 将拥有所有接口方法(直接或通过继承)。
关于通过继承使方法抽象化,其实可以这样做。因此,您在抽象 Box class 中使用抽象定义覆盖 equals
方法的示例将导致任何扩展 Box
的 classes 必须实现 equals
方法。
正如@OskarEmilsson 评论的那样,如果你这样做,那么你还应该强制实施 hashCode
,因为 equals 和 hashCode 应该彼此一致(equals 对象必须具有相等的 hashCode)。
我正在尝试构建一个抽象 class/interface 来覆盖已经存在的方法并将它们设置为抽象。这可能吗?
代码示例:
public abstract class Box {
@Override
public abstract boolean equals(Object o);
}
或
public interface Box {
@Override
boolean equals(Object o);
}
上面的class和接口的功能应该是一样的,但这是否意味着都重写了Object equals方法?即使我将其设置为抽象?
这项工作也是如此:
public class Tea extends Box {
@Override
public boolean equals(Object o) {
// TODO Auto-generated method stub
return false;
}
}
首先,接口不会覆盖方法。因此,您不能通过向接口添加 equals
方法来覆盖 Object
中的 equals
。相反,接口可以被认为是契约,它们保证任何实现它们的非抽象 class 将拥有所有接口方法(直接或通过继承)。
关于通过继承使方法抽象化,其实可以这样做。因此,您在抽象 Box class 中使用抽象定义覆盖 equals
方法的示例将导致任何扩展 Box
的 classes 必须实现 equals
方法。
正如@OskarEmilsson 评论的那样,如果你这样做,那么你还应该强制实施 hashCode
,因为 equals 和 hashCode 应该彼此一致(equals 对象必须具有相等的 hashCode)。