【发布时间】:2016-08-15 16:01:33
【问题描述】:
昨天我刚开始学习接口,一直在做一些简单的例子,我注意到我在理解类和接口之间的转换时遇到了很多麻烦,所以我阅读了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;由于我们试图将
Sandwitch类中的对象sub更改为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;完全不确定
【问题讨论】:
-
你为什么不自己试试呢?编译器会告诉你答案。
-
我对答案不感兴趣。我想知道为什么
-
但是你写这个问题好像你没有尝试过,想知道你的答案是对还是错。我建议你edit 它并添加类似“我认为这会起作用,但它不起作用。为什么?”。例如,您回答 8 并不表明您在请求推理。
-
casting 不会转换任何东西,你告诉编译器你知道正确的类型是什么,编译器应该闭嘴让它工作。如果你错了,你会在运行时得到一个错误。
-
要回答所有这些问题,您需要更多信息:
Rectangle是Sandwich的超类吗?Sandwich是Rectangle的超类吗?Rectangle是否实现Edible。可能所有这些问题的答案都是“否”,但如果没有这些信息,就不可能回答所有问题。