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 方法都返回一个值。有些是void.

碰巧你经常需要捕获返回值来做其他事情,但你不必这样做。

不用担心。如果你和我一样,你的编译器和运行时日志很快就会变得疯狂。在它持续的时候享受它。

于 2013-10-20T02:05:12.327 回答
0

编译器不会出错,因为您编写的所有内容都是合法的 java。

你没有在你的问题中说你认为编译器应该在哪里出错。在不了解更多信息的情况下,我可以假设您认为仅仅因为方法具有返回类型,该方法的调用者就必须将其分配给某些东西。Java 根本不强制执行 - 类的客户端可以合法地调用方法并完全忽略其返回值。

于 2013-10-20T01:56:58.123 回答