昨天我刚刚开始学习界面并且做了一些简单的例子,我注意到我在理解类和接口之间的转换时遇到了很多麻烦所以我读了Java Cast Interface to Class以及Interfaces Oracle Java Tutorials
然而,当我的书在底部给出一个小的评论问题时,我注意到我仍然没有完全理解,我买的那本书有解决方案。以下是问题(我给出了我的尝试和推理,这对某些人来说可能是错误的,所以任何帮助都是好的!)
假设类Sandwich实现了Edible接口,而你 给出变量声明
Sandwich sub = new Sandwich();
Rectangle cerealBox = new Rectangle(5, 10, 20, 30);
Edible e = null;
以下哪项转让声明合法?
e = sub;
由于Sandwich类实现了接口Edible
,因此没有问题。我们可以说e = sub
没有任何问题。 可行
sub = e;
由于我们正在尝试将sub
类中的对象Sandwitch
更改为interface
类型,因此我们无法在不进行强制转换的情况下执行此操作。 无法使用
sub = (Sandwich) e
作品!这解决了我们的旧问题
sub = (Sandwich) cerealBox;
我不知道..但它应该工作? cerealBox
是Rectangle
因此(Sandwich)
我们会将其转换为sub
,这是Sandwich
e =cerealBox;
不要这么认为。 Rectangle
界面未实现Edible
,因此无法正常工作
e = (Edible) cerealBox;
现在应该工作。 (Edible)就像它实现了接口一样。
e = (Rectangle) cerealBox;
不确定。我认为这不会起作用,我的意思是cerealBox
是Rectangle类型,为什么我们再次将它设为rectangle
?
e = (Rectangle) null;
根本不确定
答案 0 :(得分:3)
#4,6,7,& 8是你需要帮助的人。他们都是关于铸造的。如果原始类型和目标类型可能通过继承具有关系,则强制转换仅合法。仅当右侧具有相同类型或左侧的子类型时,变量赋值才是合法的。
sub = (Sandwich) cerealBox;
演员表演后双方都是Sandwich
类型,但(Sandwich) cerealBox
是非法演员。 这不起作用。这是非法转换的原因是因为在不同的继承分支上的类之间不能进行转换。没有Rectangle
可能是Sandwich
的情况,因此这是编译器错误。
e = (Edible) cerealBox;
这与#4不同,因为它是一个界面。这是合法的,但可能会引发运行时错误。有关详细说明,请参阅this question。在编译时,无法知道cerealBox
是否实际上是Rectangle
的{{1}}子类型Edible
。 这会有效。如果Rectangle
为final
,则无效。
e = (Rectangle) cerealBox;
将变量转换为相同类型是合法的。将Rectangle
分配给Edible
类型的变量是不合法的。 Rectangle
未实施Edible
。 这不起作用。
e = (Rectangle) null;
将null
投射到任何类型是合法的。 这不起作用但因为Rectangle
没有实现Edible
。