2015-10-20 2 views
0

У меня есть (для меня) сложная проблема Java-дженериков. Я попросил similar question в stackoverflow, но пришел к выводу, что этот пример сделал вещи слишком сложными. Итак, здесь упрощенный вопрос.Обновлено/упрощено: Java-генераторы с переопределением метода

меня есть два класса следующим

abstract public class Base { 
    abstract public Base doSomething(Base arg); 
} 

public class Variant extends Base { 
    @Override 
    public Variant doSomething(Variant arg) { // <-- error 
      // code 
    } 
} 

Сообщение об ошибке «Метод йоЗотеЬЫпд (вариант) типа Variant необходимо переопределить или реализовать метод супертипом.»

Выбранный ответ в initial question должен использовать измененные версии class Base<T extends Base<T>> и class Variant<T extends Variant<T>> extends Base<T>, который работает. Но тогда, если я хочу создать экземпляр Variant, мне нужно указать параметр generics, даже если я не нуждаюсь в нем.

Есть ли более простое решение?

+0

класс Variant extends Base ? –

+1

Метод в 'Variant' * не * переопределяет значение в' Base', потому что типы аргументов не совпадают - неважно, что это подтип другого. – JonK

ответ

4
abstract public class Base<T extends Base<T>> { 
    abstract public T doSomething(T arg); 
} 

public class Variant extends Base<Variant> { 
    @Override 
    public Variant doSomething(Variant arg) { // <-- error 
     // code 
    } 
} 
+0

иногда, сложные вещи настолько просты –

0

голоса Нет, пожалуйста, Если у вас есть функция R f(P) то переопределенный метод F»может ограничить R ребенок, но может ограничить P только суперкласс, когда е называется.

Computer Science скажет: тип результата является ко-вариантом, тип параметра является контравариантным (относительно наследования).

Решение о том, что P параметризуемо в базовом классе правильно: @AnatolyDeyneka. Для внутренней логики R == P.

doSomething то на самом деле не может быть такой переменной.

Смежные вопросы