2017-04-18 1 views
0

ジェネリックでタイプ消去のコンセプトを読んでいました。以下のコードを実行している間、私は混乱しました。ジェネリックの混乱でタイプ消去

型消去の概念を1として
public class CollectionsWild { 
    void Test(Collection<?> t){ 
     System.out.println("Collection"); 
    } 

    void Test(List<Integer> t){ 
     System.out.println("List"); 
    } 


    public static void main(String[] args) { 
     CollectionsWild o = new CollectionsWild(); 
     o.Test(new ArrayList<String>()); 
    } 

} 

、「List<Integer> tは、」バイトコードの「リストT」に変換されます。だから、私のメソッドテストは、パラメータとしてCollectionを持っていると呼ばれる。 Listをパラメータとして呼び出す必要があります

+0

ありがとうございましたが、あなたが与えたリンクは、私が求めていたものとは関係ありません。 –

答えて

2

これは消去とは関係ありません。オーバーロードの解決はコンパイル時に行われます。 1つの過負荷のみがArrayList<String>に一致し、それが選択されたものです。複数の一致があった場合は、最も具体的なものが選択されています。

同じタイプの消去でオーバーロードする場合、過負荷の解消を考慮する前にタイプの定義がコンパイルされません。

2

メソッドの選択はコンパイル時のものです。タイプ消去は、以降、となります。あなたはを考慮され、JLS§15.12.2でジェネリック型パラメータを見ることができるように:

方法は、一般的な方法(§8.4.4)の場合には、該当する意志であるかどうかの決定、型引数の解析を必要とします。