0

現在、いくつかのインターフェースを調べていますが、なぜこれが機能しないのか疑問に思っています:

interface I {
    public void doSomething(String x);
}
class MyType implements I {
    public int doSomething(String x) {
        System.out.println(x);
        return(0); 
    }
}

基本的に、インターフェイスにメソッドを実装できないのはなぜですか? 戻り値の型があるため、署名が異なりますか? メソッドを一意にするのは、名前、パラメーター、および戻り値の型ではありませんか?

4

4 に答える 4

7

異なる戻り値の型を持つことはできません。次のことを想像してください

class Foo implements I {
  public int doSomething(String x) {
    System.out.println(x);
    return(0);
  }
}
class Bar implements I {
  public void doSomething(String x) {
    System.out.println(x);
    return;
  }
}

List<I> l = new ArrayList();
l.add(new Foo());
l.add(new Bar());

for (I i : l) {
  int x = i.doSomething();  // this makes no sense for Bar!
}

したがって、戻り値の型も同じでなければなりません!

于 2012-04-19T00:36:20.710 に答える
2

ええ、あなたは基本的に正しいです。Java では、戻り値の型によるメソッドのオーバーロードが許可されていません。ただし、インターフェイスの戻り値の型は一致する必要があります。

于 2012-04-19T00:32:47.197 に答える
1

メソッド シグネチャはメソッドの名前とパラメーターの型で構成されているため、コンパイラはそれらを区別できないため、同じ名前と同じ数と型の引数を持つ複数のメソッドを宣言することはできません。

于 2012-04-19T00:37:34.207 に答える
0

インターフェースの典型的な用途を考えてみてください。例えば、Java List インターフェースを実装するものはすべて実装する必要があります。boolean add(Object o)

呼び出し元はおそらく次のようなことをするでしょう:

if (!impl.add(o)) { /* report error */ }

戻り値の型を変更できるとしたら、あらゆる種類の問題が発生します。

void add(Object o)
if (!impl.add(o)) { // ... your method returns void, so this makes no sense

float add(Object o)
if (!impl.add(o)) { // float to boolean ? are you sure that is what you meant?
于 2012-04-19T00:37:33.613 に答える