BaseFoo не может наследоваться с другими аргументами: <T, X.Bar <T >> и <T, X.Foo <T >>
Это упрощенная версияJava, унаследованный тип возврата метода Fluent в многоуровневых иерархиях.
Учитывая следующий код:
public enum X {
;
static interface BaseFoo<T, S extends BaseFoo<T, S>> {
S foo();
}
static interface Foo<T> extends BaseFoo<T, Foo<T>> {
void foo1();
}
static interface BaseBar<T, S extends BaseBar<T, S>> extends BaseFoo<T, S> {
S bar();
}
static interface Bar<T> extends BaseBar<T, Bar<T>>, Foo<T> {
void bar1();
}
}
бегатьjavac X.java
Я получаю сообщение об ошибке:
X.java:15: error: BaseFoo cannot be inherited with different arguments: <T,X.Bar<T>> and <T,X.Foo<T>>
static interface Bar<T> extends BaseBar<T, Bar<T>>, Foo<T> {
^
У кого-нибудь есть решение?
отказыватьсяЯ пытаюсь использовать шаблон для реализациисвободный интерфейс через иерархию наследования класса контейнера.
ФонЧтобы людям было проще понять, зачем мне это нужно, вот история. Я хочу создать контейнерное семейство:Traversal
<-Sequence
<-List
, ТакTraversal
есть методTraveral<T> accept(Visitor<T>)
(нетPECS для краткости) этот метод всегда должен возвращатьthis
после итерации посетителя через элементы. Когда у меняList
типа, я хочу метод возвратаList<T>
вместоTraversal<T>
потому что я хочу, чтобы можно было назвать что-то вродеmyList.accept(v).head(15)
, гдеhead(int)
это методList
неTraversal