从 ArrayList 引用接口

Referencing an interface from ArrayList

提问人:ProgrammingStudent 提问时间:3/21/2023 最后编辑:ProgrammingStudent 更新时间:3/21/2023 访问量:68

问:

在下面给出的 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");
            }
        }
    }
}

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

Java 对象 ArrayList 接口 instanceof

评论

0赞 Igor Artamonov 3/21/2023
为了确保,您的问题是关于 ?你在问这是什么意思?((Edible)objects[i])
0赞 ProgrammingStudent 3/21/2023
没错,伊戈尔。在 ((Edible)objects[i]) 中如何引用 Edible 接口?
0赞 ProgrammingStudent 3/21/2023
感谢您让我知道该@user16320675,帖子已得到更正。

答:

2赞 Igor Artamonov 3/21/2023 #1

((Edible)objects[i])语法表示对象[i]转换为可食用。它可能只是.它被包装在括号中,只是为了将其内联到以下方法调用中。(Edible)objects[i]

所以代码

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]Edibleinstanceof

如前所述,@daniu Java 16 中,您可以有另一种语法:

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

评论

2赞 daniu 3/21/2023
请注意,在较新版本的 Java (17) 中,有语法。if objects[i] instanceof Edible e) { System.out.println(e.howToEat()); }
1赞 user16320675 3/21/2023
@daniu, Igor 自 Java 16 以来是永久性的:JDK 16 发行说明(自 [Java 14,3 年前] 作为预览功能提供)
0赞 Igor Artamonov 3/21/2023
啊,谢谢。我想我仍然以某种方式坚持使用 Java 11 :(