在具有接口的对象上显式转换。圆括号的用途是什么

时间:2014-02-20 20:08:45

标签: java interface casting

我发现了一个类似的问题,但它并没有真正涉及界面问题 - 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的括号后面的逻辑是什么?

3 个答案:

答案 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,因此显然不能以这种方式进行转换。