У меня есть классы Parent и (Child extends Parent). Также у меня есть классы A и (B расширяет A).

Установите следующий код:

class Parent {
  method (A a) {
    //some actions
  }
}

class Child extends Parent {
 method (B b) {
   super.method(b)
   // some additional actions
 }
}

Допустим, у нас есть следующее:

Parent p = new Parent();
Child c = new Child();
A a = new A();
B b = new B();

Требование следующее:

p.method(a); // success
p.method(b); //RunTimeException

c.method(a); //RunTimeException
c.method(b); //success

Основная проблема здесь в том, что c.method (a) и p.method (b) работают успешно.

Можно ли добиться такого поведения с помощью дженериков? Любое предложение приветствуется.

Спасибо.

0
Baalaji 16 Фев 2021 в 20:35

1 ответ

Лучший ответ

Вы всегда можете бросить RuntimeExceptions по своему усмотрению, но не должны, скорее всего, вместо этого вы хотите получить ошибку компилятора !? И тогда возникает вопрос: почему? Child - это Parent, и все, что вы можете вызвать у родителя, должно работать и с дочерним, см. L в SOLID.

Вы можете добиться этого с помощью дженериков, используя

class Parent<T> { 
    void method (T t) { ... }
}

class Child<T> extends Parent<T> {
    void somethingElse () { ... }
}

А потом

Parent<A> p = new Parent<>();
Child<B> c = new Child<>();
A a = new A();
B b = new B();

p.method(a); // works
p.method(b); // compiler error

c.method(a); // compiler error
c.method(b); // works

Но в этот момент Child<B> является чем-то совершенно другим по сравнению с Parent<A>, и Parent p = c;, который работал бы ранее, больше не действителен / доступен.

0
luk2302 16 Фев 2021 в 17:43