编程语言
首页 > 编程语言> > java – 不能使用不同的参数继承BaseFoo:>和>

java – 不能使用不同的参数继承BaseFoo:>和>

作者:互联网

这是Java inherited Fluent method return type in multiple level hierarchies的简化版本.

给出以下代码:

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> {
           ^

有人有任何解决方案?

免责声明:我正在尝试使用该模式在容器类继承层次结构中实现fluent interface.

背景:为了让人们更容易理解我为什么需要这个,这就是故事.我想创建一个容器系列:Traversal< - Sequence< - List.所以Traversal有一个方法Traveral< T> accept(Visitor< T>)(简称PECS),此方法应在迭代访问者通过元素之后始终返回此值.当我有一个List类型时,我希望方法返回List< T>代替Traversal< T>因为我想调用像myList.accept(v).head(15)这样的东西,其中head(int)是List not Traversal的方法

解决方法:

类或接口不能从通用接口的不同实例化实现或扩展.您的Bar界面违反了此规则.我们来看看接口声明:

static interface Bar<T> extends BaseBar<T, Bar<T>>, Foo<T>

因此,Bar< T>扩展了两个接口:

> BaseBar< T,Bar< T>>
> Foo< T>

除此之外,这两个接口从同一接口BaseFoo的不同实例化扩展.

> BaseBar< T,S扩展BaseBar< T,S>>扩展BaseFoo< T,S>
> Foo< T>扩展BaseFoo< T,Foo< T>>

那些继承的接口最终也是Bar接口的超级接口.因此,您的Bar接口尝试从2个不同的BaseFoo实例扩展,这是非法的.让我们用一个简单的例子来理解原因:

// Suppose this was allowed
class Demo implements Comparable<Demo> , Comparable<String> {
    public int compareTo(Demo arg)     { ... } 
    public int compareTo(String arg) { ... } 
}

然后在类型擦除之后,编译器将为通用方法生成2个桥接方法.该课程被翻译为:

class Demo implements Comparable<Demo> , Comparable<String> {
    public int compareTo(Demo arg)     { ... } 
    public int compareTo(String arg) { ... } 

    // Bridge method added by compiler
    public int compareTo(Object arg)     { ... } 
    public int compareTo(Object arg) { ... } 
}

因此,这导致在类中创建重复桥接方法.这就是为什么不允许这样做的原因.

标签:fluent-interface,fluent,java,inheritance,generics
来源: https://codeday.me/bug/20190723/1508367.html