2011-11-07 4 views
1

こんにちは私はカスタムクラスMyListのコンストラクタをオーバーライドしたいと思います。List <CustomObjects> - "same erasure"エラーを使用するJavaオーバーライドコンストラクタ

以下のコードをコンパイルすると、「同じ消去」エラーが発生します。コンパイラの場合List<CustomClass1>は同じタイプですList<CustomClass2>

誰かが私にこれを解決する方法を提案できますか?私はList<Object>を使用してinstanceofを使用して、私はこの問題を解決することはできませんが、そのため型消去the generic type information is lost during compilationと呼ばれるものの成功

private static class MyList { 

    private int type; 

    public MyList (List<CustomClass1> custom1) { 
       type = 1; 
    } 

    public MyList (List<CustomClass2> custom2) { 
       type = 2; 

    } 
+0

[メソッドのタイプは、別のメソッドと同じ消去方法があります](http://stackoverflow.com/questions/1998544/method-has-the-same-erasure-as-another-method-in-type) ) –

答えて

1

せずにしてみてください。型情報が消去されると、両方ともpublic MyList(List l)にコンパイルされます。これはJavaの仕組みです。 Genericsは、コンパイル時にのみ使用できます。

ジェネリック型がインスタンス化される場合、コンパイラは、型消去と呼ばれる技術により、それら タイプを変換 - コンパイラはパラメータを入力し、クラスまたはメソッド内 引数を入力するために関連するすべての情報を削除プロセス。タイプ消去により、Java ジェネリックを使用するアプリケーションは、 ジェネリックより前に作成されたJavaライブラリーおよびアプリケーションとのバイナリー互換性を維持します。

1

Javaコンパイラは、typeパラメータを "消去"します。あなたは、パラメータとしてタイプを追加することができ

public MyList (List list) { 
    // ... 
} 

::だからList<CustomClass1>List<CustomClass2>は型消去(事実上の同じシグネチャ)の後Listなり

public MyList (List<?> list, int type) { 
    // ... 
} 

または多分

public MyList (List<?> list, Class<?> clazz) { 
    // ... 
} 

か型パラメータをクラスに追加

class MyList<T> { 

    public MyList (List<T> custom2, Class<T> clazz) { 
     // ... 
    } 
} 
+0

あなたの答えはtnxですが、リストの種類( 'CustomClass1'や' CustomClass2')をどうやって確認できますか?私は 'if(list.getClass()。equals(CustomClass1.class)){'を使用しようとしていますが、これは動作しません。 – Jovan

+0

@Jovan: 'Class'をパラメータとして渡すと、getClazz()この値と 'list.getClazz()。equals(CustomClass1.class)'を使用してください。 – jeha

+0

@Jovan:多分興味深いhttp://stackoverflow.com/questions/6624113/get-type-name-for-generic-parameterジェネリッククラスの – jeha

関連する問題