-4

インターフェイスと抽象クラスがあります。

interface MyInterface {int presents();};

public abstract class MyAbstractClass implements MyInterface {
    abstract void presents();
    abstract void chill();
}

コンパイラは、

abstract void presents();

戻り型は互換性がありません

MyInterface.presents()

次のオプションを提供します。

make it int type
make MyInterface.presents void type

なぜこうなった?

4

3 に答える 3

8

presents()インターフェイスで返すメソッドを定義intしましたGift。次に、という名前のクラスpresents()で戻り値の型を持つメソッドを再定義しようとします。voidmyClass

intではないことは明らかですvoid。これは、戻り値の型に互換性がないことを意味します。

メソッドの継承と混同しています。問題は、java (およびすべての c に似た言語) の構文が戻り値の使用法を指示しないため、メソッドが返されたとしても、int次のように呼び出すことができることです。

presents();

presents()したがって、コンパイラが という名前の 2つの異なるメソッドを持つことを許可すると仮定しintますvoid。コンパイラは、この例で使用するメソッドをどのように理解できますか? 答えはノーです。これが、異なるパラメータ シグネチャを使用してメソッドをオーバーライドできる理由です。

presents();
presents(String str);
presents(int n);

ただし、パラメーター シグネチャが同じで戻り値の型が異なる 2 つのメソッドを使用することはできません。

于 2013-10-14T08:10:48.407 に答える
3

インターフェイスがメソッドを持ち、presents() ここでメソッドのシグネチャを変更しようとしているためです。

そのメソッドが必要ない場合は、新しいメソッドを作成してください。

 abstract void anotherPresents();

また

元の署名を満たす

   abstract int presents();
于 2013-10-14T08:06:09.583 に答える