5

クラスがあり、以下はそのコンストラクターです

public Data(ArrayList<String> row){
}

public Data(ArrayList<Integer> row){
}

上記は私に次のようなエラーを与えています:

メソッド Data(ArrayListList) には同じ消去 Data(ArrayList) があります
タイプ Data の別のメソッドとして。

私もやってみました:

public Data(ArrayList<?> rows) {

    if (rows.get(0) instanceof String) {

        initializeData(rows);

    }

}

しかし、上記では、ArrayList 全体を ArrayList に変換する必要があります。これは非効率的だと思います。

ArrayList または ArrayList を使用してクラスをインスタンス化しようとしています (ユーザーが選択できます)。

Data = new Data( new ArrayList< String >() );

Data = new Data( new ArrayLIst< Integer >() ); したがって、上記の両方が機能するはずです。渡された入力パラメーターのタイプに基づいて、クラスはさまざまなメソッドを呼び出します。

私が望むものを達成するためのより良いものはありますか?

前もって感謝します。

4

3 に答える 3

6

ジェネリックは、消去によって Java に実装されます。これは、ジェネリック型情報がコンパイル時にのみ存在し、ジェネリックを使用するときに型の安全性を確保する責任がコンパイラだけにあることを意味します。プログラムを実行すると、ジェネリック型情報は単に存在しません。

のランタイム クラス リテラル

List<String>

そして

List<Integer>

両方です List.class

これが、オーバーロードされたコンストラクターに、ジェネリック型パラメーターのみが異なるコレクションを提供することをコンパイラが許可しない理由です。ランタイム環境の観点からは、これらのパラメーター タイプはどちらも同じです。

回避策として、それぞれのジェネリック ArrayList 型を独自のヘルパー クラスにラップできます。これにより、各ヘルパー クラスをパラメーターとして受け取る、オーバーロードされたコンストラクターを提供できます。

于 2013-11-08T05:19:25.047 に答える
0

これを行うには、ArrayList を具体的な型に拡張します。

例えば

public class IntegerArrayList extends ArrayList<Integer>{};

ただし、実際にこれを行いたい状況は非常にまれです。これを行う必要があると確信していますか?コンストラクターは互いにどのように区別されますか?

于 2013-11-08T04:50:02.310 に答える