java - 将派生类传递给需要覆盖期望基类的方法

标签 java inheritance polymorphism

我有一个类 A,它有一个抽象方法 doAction(BaseClass obj),需要一个 BaseClass 类型的参数

public class A {
    //....
    abstract void doAction(BaseClass obj);
    //....
}

现在,我有另一个需要扩展 A 的类 B。但是,B 的 doAction 方法需要使用一个扩展了 BaseClass 的对象 DerivedClass。

public class B extends class A {
     //..
     void doAction(DerivedClass obj) {
          obj.callMethodAvailableOnlyInDerivedClass();
      }

 }

我如何处理这种情况,我需要将类型为 DerivedClass 的参数传递给要重写的方法,同时它需要一个 BaseClass ?

谢谢!

最佳答案

你使基类泛化:

public class A<T extends BaseClass> {
    //....
    abstract void doAction(T obj);
    //....
}

以及用派生类参数化的子类:

public class B extends A<DerivedClass> {
     //..
     void doAction(DerivedClass obj) {
         obj.callMethodAvailableOnlyInDerivedClass();
     }
}

如果没有泛型,这是不可能的,因为 B 会破坏 A 的契约:A 接受任何类型的 BaseClass,但您限制 B 只接受特定的子类。这不尊重 Liskov principle .

关于java - 将派生类传递给需要覆盖期望基类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9421247/

相关文章:

ruby-on-rails - has_many_polymorphs 中的冲突关联

java - Java NIO 中 FileChannel.read()/write() 的命名不明确且令人困惑

java - 使用 HttpURLConnection 获取 405 响应代码

java - 如何在 Netbeans 中安装 Slick2d

java - 使用打开的 CSV Writer 从 java 中的 bean 对象生成 txt 文件时添加了额外的回车符

Java继承: Why calling a method at the parent constructor level,调用重写的子方法?

java - 在 Clojure 中扩展 Java Swing 类

inheritance - 使用继承实体的 ACL 和 Sonata Admin

java - 如何返回不确定的类型?

c++ - using-declaration 无法正常工作