2011-12-14 2 views
0

可能性の重複:
Java Generics: Array containing genericsJavaでMap.Entry <K, V>配列をどのようにインスタンス化しますか?

私は追加して、配列から要素を削除する2つの方法が含まれているJavaクラスを持っています。ジェネリックにするには、サブタイプが必要です。そのため、さまざまな種類のオブジェクトを処理できるはずです。

問題は、MapEntry(MapEntryがjava.util.Map.Entryの実装である)をサブタイプとして使用してインスタンス化するときです。これにより、Object配列をMapEntry配列に変換しようとすると、ClassCastExceptionがスローされます。

array = (T[])(new Object[array.length + 1]); 
array = (T[])(new Object[array.length - 1]); 

アレイのサイズは、それぞれ1減少/増加させるために使用されます。私はこのため、次の行(Tサブタイプである)である推測しています。私はIntegers、Strings、Objectsの配列でもこれを使用しています。

はまた、それが明示など、

を、私はこのために配列を使用する必要があると述べていないので、何のリストですまだ可能な限り一般的なように、クラスを維持しながら、この問題を回避する方法はありますか?

編集:問題を解決するために管理します。ここでは、作業コードは次のとおりです。すべての助けを

array = (T[])Array.newInstance(array.getClass().getComponentType(), array.length + 1); 
array = (T[])Array.newInstance(array.getClass().getComponentType(), array.length - 1); 

ありがとう:D

+0

タイプパラメータがバインドされていない場合、 'T'へのキャストは実際には何もしません。あなたはもう少し文脈を提供できますか?あなたのクラスの型シグニチャとそれをどのようにインスタンス化していますか? – millimoose

+0

これは、ジェネリックアレイを持つことはできません。私は 'Object' []を使い、あなたのメソッドで値を返すときにキャストします。これはまだ安全ではないキャストですが、少しだけローカライズされています。 (あるいは、 'ArrayList'がどのように実装されているかを見て、それを行います。) – millimoose

答えて

1

A)の配列を使用していない、彼らはひどいです。代わりにコレクションを使用してください。

B)アレイタイプを知らなくてもジェネリックアレイを作成することはできません。あなたがタイプ(クラス)を持っている場合は、あなたが行うことができます:

T[] array = Array.newInstance(type, length); 

読む:

+0

A)問題で述べたように、私は割り当てのためにこれをやっていて、配列を使用しなければならないことを明示しています:( B)これを詳しく教えてください。配列を作成するために配列の型を知っていなければならない場合は、これがジェネリックの全体を取り除くのではないでしょうか? – PandaConda

+0

@ user1097658はい、残念ながらJavaジェネリックスはそのように動作します。読んでください:http://docs.oracle.com/javase/tutorial/java/generics/erasure.html –

+0

これは私が問題を解決するのを助けました。質問の私の編集を参照してください。ありがとう:P – PandaConda

0

T[]配列はObject[]のサブクラスです、キャストはT[]Object[]です。しかし逆は偽です。Object[]Object[]T[]のサブクラスではないため、T[]にキャストすることはできません。

あなたの質問はHow to create an array of a generic typeになると思いますか?

関連する問題