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 では、クラス内の 2 つのメソッドが同じ名前/引数を持つことはできませんが、戻り値の型は異なります。したがって、これは禁止されています。

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は同じです。

あなたが提案していることの一般的な回避策を思い付くのは難しいです、あなたはおそらくあなたの正確な状況をもっと特定しなければならないでしょう。しかし、2つを実装するために本当にそのクラスが必要ですか、なぜ2つの異なるクラスではないのでしょうか。ネストされたクラス、あるいは匿名の内部クラスでしょうか?

于 2012-05-04T10:25:38.257 に答える