我发现了一个类似的问题,但它并没有真正涉及界面问题 - Issue about casting object brackets
public class Speak { /* Line 1 */
public static void main(String[] args) { /* Line 2 */
Speak speakIT = new Tell(); /* Line 3 */
Tell tellIt = new Tell(); /* Line 4 */
speakIT.tellItLikeItIs(); /* Line 5 */
(Truth)speakIt.tellItLikeItIs(); /*Line 6 */
((Truth)speakIt).tellItLikeItIs(); /* Line 7 */
tellIt.tellItLikeItIs(); /* Line 8 */
(Truth)tellIt.tellItLikeItIs(); /* Line 9 */
((Truth)tellIt).tellItLikeItIs(); /* Line 10 */
}
}
class Tell extends Speak implements Truth {
public void tellItLikeItIs() {
System.out.println("Right on!");
}
}
interface Truth {
public void tellItLikeItIs()
}
第7,8和10行是正确的。我得到7号,但为什么6号和9号不正确而不是8号和10号呢?为什么我们可以明确地转换为接口?使用答案8和10的括号后面的逻辑是什么?
答案 0 :(得分:2)
(Truth) tellIt.tellItLikeItIs()
在tellItLikeItIs()
对象上调用tellIt
,并将此方法返回的值强制转换为Truth
。
((Truth) tellIt).tellItLikeItIs()
将tellIt
转换为Truth
,然后在对象上调用tellItLikeItIs()
。
答案 1 :(得分:0)
“但为什么6号和9号不正确而不是8号和10号?”
这是因为运营商的优先权。铸造比方法调用低,这就是为什么你必须通过把它放在括号中来预先铸造铸造。
“为什么我们可以明确地转换为界面?”
你说,无论支持类如何,对象现在都被视为接口所说的。
答案 2 :(得分:0)
Speak
类没有方法tellItLikeItIs
,只有类Tell
和接口Truth
(它实现了)。
第8行在Tell
实例上调用上述方法,这很好。第7行和第10行显式地将对象强制转换为Truth
,然后调用该方法,这也没关系。
第6行和第9行有同样的问题 - 它们在正确的位置缺少括号。由于Java的运算符优先级,它们都尝试在某个对象上调用该方法,然后将其返回值强制转换为Truth
。由于此方法的返回值为void
,因此显然不能以这种方式进行转换。