2017-12-07 6 views
0

私は、これらのインタフェースとクラスを持っている:同じメソッドを持つ抽象クラスとinheretingサブクラスで、異なる型引数を取得して使用しますか?

public interface AlternateLight { 

    public String change(long time); 
} 

public abstract class AbstractLight { 

    public String change(int time) { 
     return "AbstractLight Method was used"; 
    } 
} 

public class DistinctAlternateLight extends AbstractLight implements AlternateLight { 

    public String change(long time) { 
     return "DistinctAlternateLight Method was used"; 
    } 
} 

は、今私は、主に以下のメソッドを持つ方法変更()を呼び出し:

public class WhatUsedTest { 

    public static void main(String[] args) { 
     AlternateLight al = new DistinctAlternateLight(); 
     System.out.println(al.change(100)); 
    } 
} 

それは「DistinctAlternateLightメソッドを使用した」印刷しますが、なぜですか?引数として100の後ろに "L"を置かなかったので、抽象クラスのメソッドは整数を取るため、抽象クラスのメソッドを呼び出します。 "L"を抜けて、コンパイラは100を長い値として処理せず、longを取るメソッドを呼び出すと推測しましたが、そうしています。どうしてこんなことに?

答えて

0

あなたはAlternateLightクラスを使用して変数を宣言し、このタイプのみ(変更するアクセスもしている場合には、多型によるものです:あなたは、あなたがそのような何かを書く場合は、抽象クラスからメソッドを呼び出すには、コンパイラを強制することができ 長い時間)。

注意してください。インタフェースを参照型として使用し、それを実装するクラスのオブジェクトを割り当てる場合、インタフェース内で宣言されているメソッドのみを呼び出すことができます。これは、実装クラスが、インタフェースとクラスの間のコントラクトの一部ではない独自のメソッドを定義できるため、非常に明白です。したがって、これらのメソッドを呼び出すには、クラスを参照タイプとして次のように使用する必要があります。

DistinctAlternateLight al =new DistinctAlternateLight(); 
0

タイプ引数に最も近いメソッドが使用されます。 互換性のある数値の場合、最も深いものが宣言されています。

0

「al」オブジェクトの型がインターフェイス型なので、キャストなしでスーパークラスからメソッドを呼び出すことはできません。キャストせずにAbstractLightから任意のメソッドを呼び出すこともできません。インターフェイスクラスで宣言されたメソッドのみを呼び出すことができます。その場合、コンパイラはインターフェイスクラスからメソッドを優先します。

System.out.println(((AbstractLight)al).change(100)); 
関連する問題