有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将超类中实现的方法转换为抽象

我有一个Java程序,其中包含以下类

public class A{
     protected String name;
     ...
     @Override
     public boolean equals(Object obj){
          if(!(obj instanceof A)){
              return false;
          }

          A a = (A)(obj);
          return a.name.equals(this.name);
     }
}

public abstract class B extends A{
    @Override
    public boolean equals(Object obj){
        return equals2(obj);
    }

    public abstract boolean equals2(Object obj);
}

public class C extends B{
    private String data;
    ...
    @Override
    public boolean equals2(Object obj){
        if(!(obj instanceof C)){
            return false;
        }

        C c = (C)(obj);
        if(c.data.equals(this.data)){
            return c.name.equals(this.name);
        }else{
            return false;
        }
    }
}

有没有一种方法可以强制所有扩展class B的类实现它们自己的equals方法,而不必像示例中那样使用equals2

谢谢


共 (2) 个答案

  1. # 1 楼答案

    在我看来,你可以让抽象类B在其equal()方法中抛出一个异常:

    public abstract class B extends A{
        @Override
        public boolean equals(Object obj){
            throw new UnsupportedOperationException("add your own implementation");
        }
    
        public abstract boolean equals2(Object obj);
    }
    

    然后,任何试图默认为继承的B方法的equals子类都将无法工作,迫使它们实现自己的版本

  2. # 2 楼答案

    我能想到的唯一方法是在Bsequals中抛出一个异常:

    public abstract class B extends A {
        @Override
        public boolean equals(Object obj) {
            throw new UnsupportedOperationException();
        }
    }
    

    这将确保未能覆盖equalsB子类不会回退到Aequals实现

    不幸的是,这将导致运行时异常,而不是编译时错误,后者更可取