提问人:ProgrammingStudent 提问时间:3/21/2023 最后编辑:ProgrammingStudent 更新时间:3/21/2023 访问量:68
从 ArrayList 引用接口
Referencing an interface from ArrayList
问:
在下面给出的 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");
}
}
}
}
请解释该接口是从语句中的对象或数组引用的,或者这是否只是与我可能不熟悉的接口相关的语法。我不精通界面的使用,所以我可能会忽略一些东西,谢谢。
答:
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]
Edible
instanceof
如前所述,@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 :(
评论
((Edible)objects[i])