2010-12-14 62 views
3

我一直在尋找通過一些生產代碼,我使用的接口作爲類型(對象)使用一個接口作爲一個類型

的概念有點糊塗,我看到這樣的解釋http://download.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html

這裏的代碼如下:

public Object findLargest(Object object1, Object object2) { 
    Relatable obj1 = (Relatable)object1; 
    Relatable obj2 = (Relatable)object2; 
    if ((obj1).isLargerThan(obj2) > 0) 
     return object1; 
    else 
     return object2; 
} 

Relatable是一個接口,我不明白它真正的邏輯爲isLargerThan(obj2)函數調用。

有人能爲我說清楚嗎?

回答

8

邏輯來自實現接口的類。這正是你不能直接實例化接口的原因,因爲接口本身不包含任何實現。該語言確保傳遞給您的方法的對象是實現接口中方法的具體類。

+0

你知道如果對象沒有實現接口會發生什麼嗎? – Albinoswordfish 2010-12-14 22:39:12

+0

@Albinoswordfish會在(可關聯的)object1處出現ClassCastException; – ILMTitan 2010-12-14 22:41:24

+0

它引發一個異常: http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html 在拋出異常之前,可以使用'instanceof'運算符來檢查有效的轉換。 – Mehrdad 2010-12-14 22:41:32

2

假設對象實際上是實現接口的類型;否則,在投射時你會得到ClassCastException

+0

它會拋出一個ClassCastException。 – 2010-12-14 22:42:08

+0

編輯,謝謝! – Mehrdad 2010-12-14 22:42:22

2

儘管編譯時間類型obj1Relatable,但運行時類型是一些實現Relatable的具體類。實際調用的代碼由該運行時類型定義。這被稱爲dynamic dispatch

相關問題