19

重複の可能性:
インターフェイス実装でのメソッド名の競合 - Java

2 つのインターフェースを実装する必要がある場合、どちらにも同じ名前とパラメーターを持つメソッドが含まれているが、戻り値の型が異なる場合はどうすればよいでしょうか? 例えば:

interface A {
    public int foo();
}

interface B {
    public double foo();
}

class C implements A, B {
    public int foo() {...}  // compilation error
}

この問題を克服する簡単な方法はありますか?

4

6 に答える 6

13

最も簡単な解決策は、可能なすべての値doubleを格納できるため、常に A を返すことです。int

オプションがない場合は、継承の代替手段を使用する必要があります。

class C {
    public A getA();
    public B getB();
}

C c = new C();
int a = c.getA().foo();
double b = c.getB().foo();
于 2012-10-08T13:15:04.630 に答える
12

できません。Java は、戻り値の型ではなく、名前とパラメーターによってメソッドを一意に識別します。

于 2012-10-08T13:14:49.877 に答える
4

Adapterクラスを記述して、いずれかのインターフェースを実装できます。

実装例:

class AdapterA implements A{
     AdapterA(C c){impl = c;}
     private final C impl;
     public int foo(){return c.fooReturningInt();}
}
class C implements B{

   public double foo(){...}
   public int fooReturningInt(){...}
}
于 2012-10-08T13:27:33.933 に答える
3

インターフェイス A と B で double と int の代わりに Number を使用します。

于 2012-10-08T13:16:38.257 に答える
3

Java のメソッドは、その署名によって一意に定義されます。http://docs.oracle.com/javase/tutorial/java/javaOO/methods.htmlから

定義: メソッド宣言の 2 つのコンポーネントは、メソッドのシグネチャ (メソッドの名前とパラメーターの型) を構成します。

于 2012-10-08T13:16:45.807 に答える
2

あなたのfoo()方法は明らかに明確に定義されていません。おそらく、 a を持つ親インターフェイスが存在するはずですpublic Number foo()。これは、それをより具体的なタイプにオーバーライドする A と B によって拡張されます。いずれかのメソッドの名前を変更しない限り、クラスがこれらの両方のインターフェイスを実装できる実用的な方法はありませんfoo

于 2012-10-08T13:15:50.020 に答える