在java中假设我们有一个实现可食用的 Fruit 类
public interface Edible {
public boolean isEdible();
}
class Fruit Implements Edible{
public String getDueDate(){
return this.dueDate;
}
public boolean isEdible(){
return True;
}
}
和人类
class Person{
public void eats(Edible fruit){
fruit.getDueDate();
}
}
我做了以下
Edible apple = new Fruit();
Person p1 = new Person()
p1.eats(apple)
但它不会起作用,因为我需要再次将它转换为Fruit,就像这样说编译器:
class Person{
public void eats(Edible fruit){
Fruit fruit = (Fruit) fruit;
fruit.getDueDate();
}
}
为什么?我以为我能够在不强制转换的情况下访问对象的方法。
答案 0 :(得分:0)
您仍然可以访问界面定义的方法而不进行强制转换。这里的问题是你的变量赋值。您的方法接受类型为Edible
的对象作为参数,但您的局部变量的类型为Fruit
。 Fruit
是一种Edible
,但编译器无法确认您传入的对象是Fruit
而不是其他Edible
,直到运行时。 (尝试将另一种类型的Edible
传递给该方法 - 您最终会得到ClassCastException
)。
正如一些评论者指出的那样,你在这篇文章中实际上并没有包含你对Edible
的定义。如果您希望能够在任何isEdible()
上调用Edible
,那么您的界面定义应如下所示:
public interface Edible {
boolean isEdible();
}
如果您已完成此操作,则应该可以在isEdible()
参数上致电Edible
。
public void eat(Edible food) {
food.isEdible();
}