【问题标题】:Why do I need to cast an object who was casted with an interface?为什么我需要转换一个使用接口转换的对象?
【发布时间】:2017-06-22 22:04:27
【问题描述】:

在java中假设我们有一个实现Edible

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

这是为什么呢?我以为我可以在不强制转换的情况下访问对象的方法。

【问题讨论】:

  • Edible 是否真的声明了 isEdible 方法?
  • 关于变量你唯一知道的就是Edible,在这种情况下你不应该转换对象,因为你不能保证它“实际上”是什么,只有@987654328 @
  • 为什么 Edible 会实现一个返回 false 的 isEdible 方法?能不能吃?
  • “我以为我可以在不强制转换的情况下访问对象的方法。” - 你只能访问接口本身定义的方法,这保证了任何实现该接口的实现都将提供该接口所描述的功能。所以我可以将Pig 传递给你的eats 方法,只要Pig 实现Edible,它就会起作用
  • 对不起,我试图用一个例子来表达我的怀疑,我不是母语人士,重点是为什么我需要将之前被投射的对象投射到界面,如果我想要使用对象方法之一,而不仅仅是接口实现的方法

标签: java oop interface casting


【解决方案1】:

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

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

public interface Edible {
    boolean isEdible();
}

如果你这样做了,你应该可以在Edible参数上调用isEdible()

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

【讨论】:

  • 对不起,我的例子出错了,问题是没有在接口中定义方法,我已经修复了,请再次检查。
  • 我以为你写了界面,只是没有在帖子中包含它,但我把信息放在那里以防万一。
猜你喜欢
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
相关资源
最近更新 更多