0

Java では、メソッド定義が何かを返す場合、そのメソッドを呼び出すクラスは、そのメソッドの戻り値を変数に取り込む準備をする必要があります。少なくともそれは私が論理的に理解していることです。しかし、コンパイラが文句を言わないという奇妙な状況があります。

メソッドが定義された Animal インターフェースがあります。Animal インターフェースを実装する AnimalImpl クラス、および Animal 型のインスタンス変数の構成を使用する Lion クラス。

これがコードです。なぜコンパイラは凶暴にならないのですか?

インターフェース:

public interface Animal {
    public int walk(int steps);
    public int fly(int miles);
    public void eat(String food);   
}

実装:

public class AnimalImpl implements Animal {
    @Override
    public int walk(int steps) {

        return steps * 100;
    }
    @Override
    public int fly(int miles) {
        return miles/5;
    }
    @Override
    public void eat(String food) {
        System.out.println("Animal ate food: "+food);

    }
}

クライアント:

public class Lion {
    private Animal ani;
    public String executeAnimalMethod(){
        ani = new AnimalImpl();
        ani.eat("carrots");
        ani.walk(100);
        ani.fly(100);
        return null;
    }
}

コンパイラがエラーをスローしないようにするにはどうすればよいですか? これはなぜですか?

4

4 に答える 4

4

メソッドから返された値を使用することは、言語の要件ではありません。

この状況は日常的かつ頻繁に発生します。例:

Set<Integer> set = new HashSet<Integer>();
set.add(1); // returned boolean ignored

Set#add()指定されたパラメーターで呼び出した結果としてセットが変更されたかどうかを示すブール値を返します (セットに既に値が含まれている場合は false を返します) が、ほとんどの場合、返された値はスニペットのように無視されます。

于 2013-10-20T01:55:56.633 に答える
1

戻り値を変数に格納する必要はありません。返還されたからといって、手元に置いておかなければならないわけではありません。

于 2013-10-20T01:55:52.273 に答える
0

あなたが書いたものはすべて正当なJavaであるため、コンパイラはエラーになりません。

あなたの質問では、具体的にコンパイラがエラーを起こすべきだと思った場所を言いませんでした。詳細を知らなくても、メソッドに戻り値の型があるという理由だけで、そのメソッドの呼び出し元がそれを何かに割り当てる必要があると考えることができます。Java はそれをまったく強制しません。クラスのクライアントはメソッドを呼び出し、その戻り値を合法的に完全に無視することができます。

于 2013-10-20T01:56:58.123 に答える
0

エラーが発生しないことにそれほど取り乱している人を見たことがないと言わざるを得ません。

まず、Java では、メソッドから返された値をキャプチャする必要はありません。

次に、すべての Java メソッドが値を返すわけではありません。一部はvoid.

たまたま、他のことをするために戻り値を取得する必要がある場合がよくありますが、その必要はありません。

心配しないで。あなたが私のような人であれば、コンパイラーと実行時ログはすぐに暴走するでしょう。それが続く間、それを楽しんでください。

于 2013-10-20T02:05:12.327 に答える