4

问题:

基础接口:

 IBase

后人:

InterfaceA extends IBase<Interface1>

InterfaceB extends IBase<Interface2>

当我尝试:

InterfaceC extends InterfaceA, InterfaceB 

我收到编译错误:

The interface IBase cannot be implemented more than once with different arguments

是否存在解决方法?谢谢。

4

2 回答 2

4

这是不可能的,至少在 Java 中是不可能的。考虑以下场景:

    interface Base<K> {
    K get();
}

interface A extends Base<String> {
    String get();
}

interface B extends Base<Integer> {
    Integer get();
}

interface AB extends A, B {
    ??
}

当你去尝试实现 AB 时,如果可能的话,get() 方法会返回什么类型。在 Java 中,一个类中的两个方法不能具有相同的名称/参数但返回类型不同......因此,这是禁止的。

如果您确实需要一些类似于 Java 允许的功能,我会建议以下内容:

    abstract class C {
    A a;
    B b;
    String aGet() {
        return a.get();
    }

    Integer bGet() {
        return b.get();
    }
}

或者,保留泛型:

abstract class C<K, T> {
    Base<K> a;
    Base<T> b;
    K getA() {
        return a.get();
    }

    T getB() {
        return b.get();
    }
}
于 2012-05-04T10:35:36.310 回答
3

泛型基本上只是编译时检查,所以 InterfaceA 和 InterfaceB 是相同的。

您所建议的一般解决方法很难提出,您可能需要更多地指定您的确切情况。但是你真的需要那个类来实现这两个,为什么不是两个不同的类呢?也许是嵌套类,甚至是匿名内部类?

于 2012-05-04T10:25:38.257 回答