为什么我需要转换一个使用接口转换的对象?

时间:2017-02-06 02:54:07

标签: java oop interface casting

在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();
    }
}

为什么?我以为我能够在不强制转换的情况下访问对象的方法。

1 个答案:

答案 0 :(得分:0)

您仍然可以访问界面定义的方法而不进行强制转换。这里的问题是你的变量赋值。您的方法接受类型为Edible的对象作为参数,但您的局部变量的类型为FruitFruit是一种Edible,但编译器无法确认您传入的对象是Fruit而不是其他Edible,直到运行时。 (尝试将另一种类型的Edible传递给该方法 - 您最终会得到ClassCastException)。

正如一些评论者指出的那样,你在这篇文章中实际上并没有包含你对Edible的定义。如果您希望能够在任何isEdible()上调用Edible,那么您的界面定义应如下所示:

public interface Edible {
    boolean isEdible();
}

如果您已完成此操作,则应该可以在isEdible()参数上致电Edible

public void eat(Edible food) {
    food.isEdible();
}