2010-12-14 3 views
3

私はいくつかの生産コードを探していた、と私はこの説明を見た型として(オブジェクト)型としてのインターフェイスを使用して

をインタフェースを使用しての概念に少し混乱しているhttp://download.oracle.com/javase/tutorial/java/IandI/interfaceAsType.html

それは isLargerThan(obj2)関数呼び出しのためのロジックを取得する場所 Relatableがインターフェイスである

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; 
} 

が、私は理解していない:

は、ここで以下のコードです。

誰かが私にこのことを明確にすることはできますか?

答えて

8

ロジックは、インターフェイスを実装するクラスから来ます。これは、インターフェイス自体に実装が含まれていないため、インターフェイスを直接インスタンス化できない理由です。この言語は、メソッドに渡されるオブジェクトが、インタフェース内のメソッドを実装する具象クラスであることを保証します。

+0

オブジェクトがインターフェイスを実装していない場合、どうなるのか知っていますか? – Albinoswordfish

+0

@ Albinoswordfish(Relatable)object1にClassCastExceptionが存在します。 – ILMTitan

+0

例外をスローします。 http://download.oracle.com/javase/tutorial/java/IandI/subclasses.html 例外がスローされる前に、有効なキャストをチェックするために 'instanceof'演算子を使用できます。 – Mehrdad

2

オブジェクトは、実際にはインターフェイスを実装するタイプのものであると想定しています。それ以外の場合は、キャスト時にClassCastExceptionが返されます。

+0

ClassCastExceptionがスローされます。 –

+0

編集ありがとう! – Mehrdad

2

obj1のコンパイル時のタイプはRelatableですが、ランタイムタイプは具体的なクラスで、Relatableを実装しています。実際に呼び出されるコードは、その実行時の型によって定義されます。これはdynamic dispatchとして知られています。

関連する問題