У меня есть (для меня) сложная проблема Java generics. Я прочитал некоторые документы и понял некоторые, но, конечно, не все, что мне нужно. В принципе, для меня попытка решить это приведет к попытке и ошибке.Генераторы Java, связанные с наследованием, и это
В следующем случае я даю сжатый пример моего кода, один раз без каких-либо дженериков (так можно надеяться понять, чего я хочу достичь), а другой с некоторыми дополнениями, которые приближаются к решению. Пожалуйста, исправьте мою вторую версию и/или укажите мне конкретную документацию. (У меня есть общая документация Java-дженериков, но у моего кода, похоже, есть несколько препятствий и трудно найти правильное решение)
О моем примере: Существует абстрактный базовый тип и несколько вариантов реализации (предоставляется только один вариант). Метод combine()
вызывает getOp1()
, который решает (в зависимости от <some condition>
), если он должен работать на своем собственном экземпляре или на новом. После вычисления возвращается целевой экземпляр.
abstract class Base {
protected final Base getOp1() {
if(Util.isConditionMet()) { return getNewInstance(); }
else { return this; }
}
protected abstract Base getNewInstance(); // returns a new instance of an implementing class
public abstract Base combine(Base other);
}
class Variant extends Base {
public Variant getNewInstance() { return new Variant(); }
public combine(Variant op2) {
Variant op1 = getOp1();
op1.calculate(op2);
return op1;
}
private void calculate(Variant other) { /* some code */ }
}
Версия с некоторыми генериками. Эта версия неисправна и не компилируется.
abstract class Base<T extends Base<T>> {
protected final T getOp1() {
if(Util.isConditionMet()) { return getNewInstance(); }
else { return this; }
}
protected abstract T getNewInstance(); // returns a new instance of an implementing class
public abstract T combine(T other);
}
class Variant<T extends Variant<T>> extends Base<T> {
protected T getNewInstance() { return new Variant(); }
public T combine(T op2) {
T op1 = getOp1();
op1.calculate(op2);
return op1;
}
private void calculate(T other) { /* some code */ }
}
'... и не compile.' Пожалуйста, включите сообщения об ошибках компилятора с соответствующими номерами строк –
Ну, ваши ошибки компилятора, безусловно, связаны с тем, что вы возвращаете 'this' в метод getOp1' Base. Как вы можете вернуть «это» из абстрактного объекта? Вся суть абстрактного объекта заключается в том, что он не может быть создан. – thatidiotguy
@thatidiotguy, потому что он делегирует getNewInstance(), который также является абстрактным –