Передача производного класса в метод, который должен переопределить ожидающий базовый класс - PullRequest
15 голосов
/ 24 февраля 2012

У меня есть класс A с абстрактным методом doAction (BaseClass obj), ожидающим параметр типа BaseClass

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

Теперь у меня есть другой класс B, который должен расширять A. Однако, метод doAction B должен использовать объект DerivedClass, который расширяет BaseClass.

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

 }

Как мне справиться с такой ситуацией, когда мне нужно передать параметр типа DerivedClass в метод, который будет переопределен, пока он ожидает BaseClass?

Спасибо!

Ответы [ 3 ]

21 голосов
/ 24 февраля 2012

Вы делаете базовый класс универсальным:

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, чтобы принимать только определенный подкласс.Это не относится к принципу Лискова .

4 голосов
/ 24 февраля 2012

Вы можете использовать:

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();
  }

}
1 голос
/ 24 февраля 2012

В java нет Contra-Variance параметров, так как это небезопасно.

Предположим, у вас есть A a = new B();

А потом вы вызываете a.doAction(new BaseClass()) Что будет?

Это вызовет ошибку времени выполнения, поскольку B не знает, что делать с BaseClass. Java хочет избежать этого - поэтому нет ковариации параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...