Переопределить класс параметра в методе, если он расширяет класс параметра, используемого в абстрактном методе - PullRequest
0 голосов
/ 02 декабря 2018

Предположим, у меня есть следующие четыре класса, из которых два абстрактных и два конкретных: Abstract1, Concrete1, Abstract2, Concrete2.

Concrete1 расширяется Abstract1 и Concrete1 расширяет Abstract1.

Предположим, у меня есть следующие четыре класса, из которых два абстрактных и два конкретных: AbstractProp, ConcreteProp, AbstractClass, ConcreteClass.

ConcreteProp расширяет AbstractProp и ConcreteClass расширяет AbstractClass.

Код для AbstractClass будет выглядеть следующим образом:

public abstract class AbstractClass {
    protected AbstractProp someProperty;

    public abstract void setProperty(AbstractProp someProperty);
}

При реализации ConcreteClass я хочу иметь возможность сделать что-то подобное (имейте в виду, что AbstractProp расширяет `ConcreteProp):

public class ConcreteClass extends AbstractClass {
    @Override
    public void setProperty(ConcreteProp someProperty) {
        this.someProperty = someProperty;
    }
}

Но этот последний бит кода недопустим, потому чтоклассы параметров (AbstractProp и ConcreteProp) в setProperty() отличаются, делая аннотацию @Override недействительной.Есть ли способ, которым я могу выполнить то, что я пытаюсь сделать здесь, возможно, используя дженерики и / или символы подстановки?

ПРИМЕЧАНИЕ: Я знаю, что этот тип именования является плохой практикойи код слишком упрощенный, на самом деле я им не пользуюсь, и это всего лишь пример, позволяющий максимально упростить вопрос.

1 Ответ

0 голосов
/ 02 декабря 2018

Если вы введете дженерики для AbstractClass, вы сможете добиться того, что запрашиваете.

public abstract class AbstractClass<T extends AbstractProp> {
    protected T someProperty;

    public void setProperty(T someProperty) {
        this.someProperty = someProperty;
    }
}

И затем указать, что вы хотите, чтобы ConcreteProp был тем типом, который вы хотите в ConcreteClass.

public class ConcreteClass extends AbstractClass<ConcreteProp> {

    @Override
    public void setProperty(final ConcreteProp someProperty) {
        this.someProperty = someProperty;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...