Java接口强制.equals()覆盖

时间:2018-05-16 19:59:31

标签: java inheritance override

我有工厂的界面。假设存在public interface ModuleFactory<T extends Module> { T createModule(long seed); } 的接口(我需要区分模块子类型)。由继承树的相同叶类定义的任何两个工厂总是相同的。

Set

这些工厂进入.equals(),因此它们的相同性由Object确定。因此,我需要一种方法来强制实现类重写此方法。否则,该集将填写重复项。

问题是boolean equals(Object obj);已经实现了这个方法,所以任何具体的类都已经有了该方法的实现。我不能简单地将program main use, intrinsic :: ISO_FORTRAN_ENV, only : dp=>REAL64, stdout=>OUTPUT_UNIT implicit none real(kind=dp), parameter :: pi = 3.141592653589793238462643383279502884197_dp write(stdout,*) pi ! Test the default format write(stdout,'(f)') pi ! Test the specific decimal default format write(stdout,'(f20.15)') pi ! Probably sufficient precision... write(stdout,'(f30.20)') pi ! EXCESSIVE PRECISION! end program main 放在我的界面中,因为任何具体的类都已经满足了默认实现的接口。如何强制覆盖?

2 个答案:

答案 0 :(得分:0)

您无法强制等于覆盖。但是你可以创建一个抽象类,为equals()提供一个实现,它实际上会调用一个抽象的customEquals()方法。所以,你的所有课程都被迫实施customEquals();您可以在其中为equals提供自定义实现。

答案 1 :(得分:0)

尝试使用下面的代码:

  public abstract class ModuleFactory<T extends Module> {

        public abstract T createModule(long seed);
        private int _hash = -1;
        // You yourself generate the HashCode on create instance class
        public OnChangeStatusListener(int _hash) { 
            this._hash = _hash;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            ModuleFactory that = (ModuleFactory) o;
            return _hash == that._hash;
        }

        @Override
        public int hashCode() {
            return _hash;
        }

    }