【发布时间】:2017-06-22 22:04:27
【问题描述】:
在java中假设我们有一个实现Edible
的类Fruitpublic 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();
}
}
这是为什么呢?我以为我可以在不强制转换的情况下访问对象的方法。
【问题讨论】:
-
Edible是否真的声明了isEdible方法? -
关于变量你唯一知道的就是
Edible,在这种情况下你不应该转换对象,因为你不能保证它“实际上”是什么,只有@987654328 @ -
为什么 Edible 会实现一个返回 false 的 isEdible 方法?能不能吃?
-
“我以为我可以在不强制转换的情况下访问对象的方法。” - 你只能访问接口本身定义的方法,这保证了任何实现该接口的实现都将提供该接口所描述的功能。所以我可以将
Pig传递给你的eats方法,只要Pig实现Edible,它就会起作用 -
对不起,我试图用一个例子来表达我的怀疑,我不是母语人士,重点是为什么我需要将之前被投射的对象投射到界面,如果我想要使用对象方法之一,而不仅仅是接口实现的方法
标签: java oop interface casting