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

时间:2012-02-23 21:02:45

标签: java inheritance polymorphism

我有一个A类,抽象方法doAction(BaseClass obj)期望一个类型为BaseClass的param

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时要覆盖的方法?

谢谢!

3 个答案:

答案 0 :(得分:21)

您使基类通用:

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

答案 1 :(得分:4)

您可以使用:

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


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

}

答案 2 :(得分:1)

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

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

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

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