Как ссылаться на универсальный тип суперкласса в подклассе в Java? - PullRequest
0 голосов
/ 25 декабря 2018

У меня следующий базовый класс

class Base<T> {
    // ...
}

, и у меня есть этот класс для расширения базы

class Derived extends Base<String> {
    public void doSomething(String param) { // this works

    }

    public void doSomething(Base::T param) { // this DOES NOT work

    }
}

Я хочу знать, есть ли трюк Java для получения определения второй функцииработать без использования конкретного класса String напрямую?

Ответы [ 2 ]

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

Чтобы передать различные параметры в ваш метод, вы можете реализовать параметр верхнего ограниченного типа.

class Derived<T extends Foo> extends Base<Foo> {
   public void doSomething(Foo param) { // this works

   }
}

public <T extends Foo> void doSomething(List<T> foos) {}
public void doSomething(List<Foo> foo) {}

Дано: class Bar extends Foo { }

List<Bar> list = new ArrayList<Bar>();
doSomething(list);
0 голосов
/ 25 декабря 2018

Да, у меня есть причина.Есть много классов, необходимо расширить базу с различными конкретными типами.Я хочу избежать изменения сигнатуры funciton в каждом классе, по возможности этого следует избегать.

Если у вас есть много классов, которым необходимо расширить класс Base<T>, и у всех них есть doSomethingметод, вы, вероятно, должны поместить doSomething в Base<T>:

class Base<T> {
    public void doSomething(T param) {} // or even make this abstract
}

И затем IDE, такие как IntelliJ IDEA, могут сгенерировать переопределенный метод для вас.Когда вы начинаете вводить имя метода, появляется следующее:

enter image description here

Вы нажимаете ввод, и тогда он будет сгенерирован для вас.

@Override
public void doSomething(String param) {
    super.doSomething(param);
}

Я подозреваю, что вы можете копировать и вставлять реализацию doSomething, потому что иначе, почему вы думаете, что раздражает изменение типа параметра для каждой реализации?

Если реализациив основном такие же, рассмотрите возможность использования метода doSomething в Base<T>, затем извлеките части, которые отличаются, в метод doSomethingImpl, который будет переопределен производными классами.

...