在 java 中,我希望返回必须捕获的值的方法调用不会引发编译错误.为什么



在Java中,如果方法定义返回某些内容,则调用该方法的类必须准备将该方法的返回值捕获到变量中。至少这是我在逻辑上理解的。但是我有一个奇怪的情况,编译器没有抱怨。

我有一个定义了方法的动物接口。实现 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;
    }
}

编译器如何不抛出错误?为什么会这样呢?

使用从方法返回的值不是语言要求。

这种情况经常发生,例如:

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

Set#add() 返回一个布尔值,指示集合是否由于使用给定参数调用集合而更改(如果集合已包含该值,则返回 false),但大多数情况下,返回的值被忽略,如代码段中所示。

您不必将返回值存储在变量中。 仅仅因为它被退回并不意味着你必须把它留在身边。

编译器没有错误,因为你写的所有东西都是合法的java。

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

我不得不说,我从未见过有人因为没有错误而如此心烦意乱。

首先,Java 不会强制你捕获从方法返回的值。

其次,并非所有 Java 方法都返回值。有些是void.

碰巧您经常需要捕获返回值来执行其他操作,但您不必这样做。

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

最新更新