1

申し訳ありませんが、以前は間違ったコードがありました...

だから私は次のようなインターフェースを持っています:

public interface Player { 
    void setPartner(Player partner); 
}

そして、次のようなインターフェイスの実装があります。

public class Human implements Player
{
    private Human partner;

    public void setPartner(Human partner)
    {
        this.partner = partner;
    }
}

そのため、コンパイラは、Player のすべてのメソッドを実装しているわけではないことを示しています。これは、setPartner メソッドのパラメーターの型を正確に一致させる必要があることを示しています。これを回避する、またはこれを別の方法で実装する良い方法はありますか?

4

3 に答える 3

3

Java では、メソッド パラメータは不変です。つまり、 is-aであっても、メソッドvoid setPartner(Player partner)シグネチャはメソッド シグネチャとは異なります。したがって、そのように実装 (またはオーバーライド) することはできません。void setPartner(Human partner)HumanPlayer

クラスを拡張するときは注意が必要です。なぜなら、それPlayerがクラスであり、メソッドが実際に機能するよりも抽象的ではない場合、メソッドをオーバーライドする代わりにオーバーロードしてしまうからです。

于 2012-10-04T23:30:44.540 に答える
2

共変パラメーターを持つことはできませんが(Playerインターフェイスを介してHumanインスタンスを操作するとどうなりますか?)、ジェネリックを使用できます。

public interface Player<T extends Player<T>> {
    void setPartner(T partner);
}

public class Human implements Player<Human> {
    private Human partner;

    public void setPartner(Human partner) {
        this.partner = partner;
    }
}

ただし、実装クラスが実際に独自の型をPlayerの型パラメーターとして使用するように強制することはできません。

于 2012-10-04T23:26:38.783 に答える
1

setPartner(Human)これは、より制限的であるため、理にかなっていsetPartner(Player)ます。を実装することで、それはすべてを受け入れるPlayerと言っています。メソッドはサブクラスのみを受け入れ、他の実装は受け入れません。setParnerPlayersetPartner(Human)HumanPlayer

于 2012-10-04T23:51:11.073 に答える