2010-11-20 44 views
2

私は文字列のリストのリストを作成しようとしています、型不一致エラー

List<List<String>> string= new ArrayList<ArrayList<String>>(); 

となっ種類の不一致エラー:ArrayList<ArrayList<String>>からList<List<String>>に変換することはできません。

は私が

List<List<String>> to ArrayList<ArrayList<String>> 

変更することができます知っていて、それが正常に動作します。

しかし、なぜ私はそれが起こることができないのだろうかと思っていましたか?簡単なList<Object>ArrayList<Object>を参照できるので、これについては何が違うのですか?

答えて

1

List<List<String>>は、配列リストではない文字列の他のリストを受け入れるため、最初にその型を宣言した方法とは異なります。たとえば、List<List<String>>に変換した場合は、技術的にはLinkedList<String>を追加することが許可されます。それはArrayList<String>ではありません。そのキャストを許可すると、ジェネリック型のシステムが効果的に中断されます。

つまり、になります。List<ArrayList<String>>に変換してください。しかし、List<List<String>>ではありません。

+0

ありがとう、いい説明。また、Thanks StudiousJoseph。 –

1
List<List<String>> string = new ArrayList<List<String>>() 

正しい方法ですか。

よろしく、

1

それはジェネリック医薬品のコンパイル時の型の安全性の約束に違反するため、あなたはList<List<String>>ArrayList<ArrayList<String>>を割り当てることはできません。この割り当てが有効だった場合はLinkedList<String>ArrayList<ArrayList<String>>に挿入し、タイプセーフを無効にすることができます。

List<Number>の正規の例はList<Integer>ではありません。それは矛盾によって容易に見える。あなたのために働くが、十分ではありません のArrayListを>():男はすでに私はあなたが書いたその定義に気づくしたいと述べているものに加えて

List<Integer> ints = new ArrayList<Integer>(); 
ints.add(42); 

//This results in compiler error 
/* List<Number> nums = ints; */ 
//If it were not and an error, then you could 

List<Number> nums = ints; 
//Now you can insert doubles into a list of `Number`s 
nums.add(0.1); 

//This would allow 0.1 to assign to an int 
Integer x=ints.get(1); 
//This will cause ClassCastException and 
//violate type-safety provided by generics. 
0

あなたが言う必要があります:

一覧>リスト=新しいArrayListを>();

ルールは、抽象クラスまたはインタフェースがある場合は、ジェネリック定義の中に具体的なクラスを記述したり、代入の左部分に書くことはありません。私のバージョンでは、将来、このデータ構造を使用するコードを変更することなくリストの実装を変更することができます。

さらにリストはコレクションです。特定のリストの機能を使用することが重要でない場合(例:このリストを反復する場合は、次のように言うことができます。

Collection> list = new ArrayList>();あなたも設定するためのリストを変更することができ、将来的にこの場合

コレクション>リスト=新しいLinkedHashSetのを>();

関連する問題