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

我有一个类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的param传递给期望BaseClass时要重写的方法?

谢谢!

您使基类通用:

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

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

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

没有generics,这是不可能的,因为B会破坏A的契约:A接受任何类型的BaseClass,但是你将B限制为只接受一个特定的子类。 这不尊重利斯科夫原则 。

您可以使用:

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

java中没有参数的Contra-Variance ,因为它不安全。

假设您有A a = new B();

然后你调用a.doAction(new BaseClass())会发生什么?

它会导致运行时错误,因为B不知道BaseClass “内容”。 java想要避免它 – 因此没有参数的协方差。