1

以下の例を考えてみましょう。

メソッドdoSomething3のパラメータータイプとしてBImplを使用できないのはなぜですか?「許可されていません」と言うときは、EclipseがインターフェイスAInfのdoSomething3-メソッドが実装されていないと文句を言っていることを意味します。

interface AInf
{
    AInf doSomething();
    BInf doSomething2();
    void doSomething3(BInf param);
}


interface BInf
{

}

class AImpl implements AInf
{

    @Override
    public AImpl doSomething() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public BImpl doSomething2() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void doSomething3(BImpl param) // This method is not overriding the doSomething3(BInf param) from the AInf
    {
        // TODO Auto-generated method stub
    }
}

class BImpl implements BInf
{

}
4

5 に答える 5

3

doSomething3(BImpl param)を実装していないためdoSomething3(BInf param)

BInf多くの実装を持つことができ、メソッドは1つだけでなく、それらすべてに対して機能する必要があります。

is aクラスを拡張したり、インターフェースを実装したりすると、関係が定義されることを常に念頭に置いてください。拡大/縮小のすべてのルールは、これの論理的帰結です。

あなたが特定の例でそれを想像するならば、それはより簡単です:お金。コインはお金であり、ノートもお金です。

購入からコインへの変更を制限することにしたお店に行くと、迷惑かもしれませんが、合法です。それは契約を破らないのでそれは大丈夫です、彼らは常にお金を返しています。

しかし、あなたが彼らがお金を受け入れることになっている店にいて、彼らがあなたのコインを受け入れないとき、それは大丈夫ではありません。

于 2012-08-08T11:54:18.230 に答える
3

インターフェイスと同じタイプである必要があります。

インターフェースはそれが受け入れると言っています

void doSomething3(BInf param);

つまり、すべてのサブタイプを受け入れますBInf(同じように動作することが期待できるため、Liskov SubstitutionPrincpleを参照してください) 。

あなたの実装はこの契約に従わない

public void doSomething3(BImpl param)

この実装では、私はのためだけに働くと言っていますBImplが、については何も言っていませんBInf

(@IsmerSlomicからの質問に応じて編集)

戻り型の場合、Javaでは共変の戻り型が許可されます。これは、少なくともインターフェイスのリターンタイプであることを保証するものを返すため、LSPを壊すことはありません。戻りタイプがより特殊化されている場合でも、LSPによって、元のインターフェイスを返すのと同じことが行われます。

于 2012-08-08T11:55:25.940 に答える
0

その宣言:

void doSomething3(BInf param);

しかし、あなたは別のタイプで実装しようとします:

public void doSomething3(BImpl param)

BinfとBImpl

于 2012-08-08T11:53:32.717 に答える
0

問題は、doSomething3がパラメーターとしてBimplを使用しているが、インターフェースはパラメーターがBInfであると示していることです(BImplはBInfではありません)。また、@ Overrideアノテーションがあるため、インターフェイスからメソッドをオーバーライドしていることをコンパイラーに通知していますが、これは明らかにエラーではないため、エラーになります。

于 2012-08-08T11:54:58.893 に答える
0

AImplとBImplは共変の戻り型であるため、返すことができます(つまり、すべてのAImplオブジェクトはAInfオブジェクトであり、すべてのBImplオブジェクトはBInfオブジェクトであるため、呼び出し元は、インターフェイスで宣言されたAInfまたはBInfオブジェクトを返していることを認識します。 )。

ただし、doSomething3()メソッドに渡される内容を制御できないため、これはメソッドパラメーターでは機能しません。したがって、BInf引数が実際にBImplであるという保証はありません。

于 2012-08-08T11:59:23.553 に答える