这是Java inherited Fluent method return type in multiple level hierarchies的简化版本。BaseFoo不能使用不同的参数继承:<T,X.Bar<T>>和<T,X.Foo<T>>
考虑下面的代码:
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> {
^
任何人有任何解决方案?
Disclaim:我试图使用该模式跨容器类继承层次结构实现fluent interface。
背景:让人们更容易理解为什么我需要这个,这里是故事。我想创建一个容器系列:Traversal
< - Sequence
< - List
。所以Traversal
有一个方法Traveral<T> accept(Visitor<T>)
(简称no PECS),这个方法应该总是返回this
迭代访问者通过元素。当我有一个List
类型,我希望该方法返回List<T>
,而不是Traversal<T>
,因为我想让它可以调用类似myList.accept(v).head(15)
,其中head(int)
是List
方法不Traversal
我的答案[here](http://stackoverflow.com/questions/7354740/is-there-a-way-to-refer-to-the-current-type-with-a-type-variable/7355094 #7355094)似乎有关。 –
@PaulBellora这真是一个全面的答案。尼斯。我想这是OP在这里需要的。 –
是的@PaulBellora,我之前读过。但我的情况是关于一个容器继承系列,它引入了另一个''类型。你能想出一个基于我的代码的解决方案吗? –