java 从ArrayList引用接口

bq9c1y66  于 2023-03-21  发布在  Java
关注(0)|答案(1)|浏览(158)

我在理解下面给出的java代码示例中第7行的**((Edible)objects[i]).howToEat()**时遇到了问题。Edible是一个包含抽象方法howToEat()的接口,我理解这是对数组的引用,但在此语句中如何引用“Edible”接口?

public class TestEdible {
    
    public static void main(String[] args) {
        Object[] objects = {new Tiger(), new Chicken(), new Apple()};
        for (int i= 0; i <objects.length; i++) {
            if(objects[i] instanceof Edible) {
                System.out.println( ((Edible)objects[i]).howToEat() );
            }
            else {
                System.out.println("Object is not edible");
            }
        }
    }
}

请解释接口是否是从语句中的对象或数组引用的,或者这只是一个我可能不熟悉的与接口相关的语法。我不太熟悉接口的使用,所以我可能忽略了一些东西,谢谢。

snz8szmq

snz8szmq1#

((Edible)objects[i])语法意味着 * 将objects[i]转换为Edible *。它可以只是(Edible)objects[i]。它被 Package 在方括号中,只是为了在下面的方法调用中内联它。
所以代码

if(objects[i] instanceof Edible) {
   System.out.println( ((Edible)objects[i]).howToEat() );
}

可以重写为更容易阅读:

if(objects[i] instanceof Edible) {
   Edible currentObject = (Edible) objects[i];
   System.out.println(currentObject.howToEat());
}

因此,您基本上是在告诉Java编译器,您希望将object[i]作为Edible进行威胁,因为您知道自己要做什么,并且已经使用上面的instanceof进行了检查。
正如@daniu所指出的,在Java 16中,您可以使用另一种语法:

if(objects[i] instanceof Edible currentObject) {
   System.out.println(currentObject.howToEat());
}

相关问题