1

重複の可能性:
拡張インターフェースでのリターンタイプのオーバーライド-悪い考えですか?

次のインターフェースについて考えてみましょう。

public interface Cat{
    public Object getCat();//returns any type of object
}

public interface DomesticCatInterface{
    public String somethinOnlyRelatedToDomesticCat();
}

public interface WildCatInterface{
    public String somethinOnlyRelatedToWildCat();
}

public class DomesticCat implements Cat, DomesticCatInterface{
    @Override
    public DomesticCat getCat(){
        return this;
    }

    @Override
    public String somethinOnlyRelatedToDomesticCat(){
        return "something";
    }

}

public class WildCat implements Cat, WildCatInterface{
    @Override
    public WildCat getCat(){
        return this;
    }

    @Override
    public String somethinOnlyRelatedToWildCat(){
        return "something";
    }
}

クラスから参照を取得する必要がある場合、これは良い習慣に従いますか?

4

3 に答える 3

2

getCat()にObjectを返す代わりに、Catを返すようにします。これにより、Catを実装するすべてのクラスを返すことができるはずです。Java 5では、これは共変リターンタイプと呼ばれます

于 2012-12-12T05:38:10.923 に答える
2

誰もが書いているように、リターンタイプを絞り込むことが可能です。

しかし、最後の質問に対して、それが参照を取得するための良い方法である場合、答えはノーです。そのオブジェクトへの新しい参照は取得されませんが、呼び出し元のオブジェクト(率直に言って-すでにインスタンスがあります)への参照は、同じものを指しているだけです。

newキーワードを使用して、新しいインスタンスを取得します。

于 2012-12-12T06:01:52.717 に答える
0

はい、(Java 5以降)メソッドをオーバーライドするときに、メソッドの戻り値の型を狭める(広げるのではなく)ことが可能です。

それがあなたのコードをよりきれいにするのを助けるとき、私はそれのために行くと思います。

メソッド引数のタイプを狭める(または広げる)ことはまだできないことに注意してください。

また、自己参照ジェネリックを使用して、インターフェイスの実装にこれを強制することもできます。

于 2012-12-12T05:36:51.963 に答える