4

次のコードスニペットがあります

public class Test {
    static interface I1 { I1 m(); }

    static interface I2 { I2 m(); }

    static interface I12 extends I1,I2 { I12 m(); }

    public static void main(String [] args) throws Exception {
    }
}

コンパイルしようとすると、エラーが発生しました。

Test.java:12: types Test.I2 and Test.I1 are incompatible; both define m(), but with unrelated return types.

これを回避する方法は?

4

4 に答える 4

2

Java - インターフェース実装におけるメソッド名の衝突で説明したように、これを行うことはできません。

回避策として、アダプター クラスを作成できます。

于 2012-03-14T15:02:03.113 に答える
1

これは、Sun の Java 6 コンパイラのバグです。

于 2013-06-24T14:23:21.900 に答える
1

xamdeで言及されていますが、完全には説明されていません。共変の戻り値の型に関連しています。

JDK 5 では、共変は追加された場所で返されます。そのため、以下は問題なくコンパイルされ、問題なく実行される有効なケースです。

public interface A {
    public CharSequence asText();
}

public interface B {
    public String asText();
}

public class C implements A, B {

    @Override
    public String asText() {
        return "C";
    }

}

したがって、以下はエラーなしで実行され、メイン出力に「C」が出力されます。

A a = new C();
System.out.println(a.asText());

これは、String が CharSequence のサブタイプであるため機能します。

于 2012-05-16T18:07:34.277 に答える
0

同じ問題が発生しましたが、OracleのJDK7を使用すれば問題ないようです。

于 2012-05-16T17:40:48.543 に答える