2016-07-20 6 views
1

以下のコード行があります。ArrayListは生の型です。ジェネリック型ArrayListへの参照<E>はパラメータ化されていなければなりません。エラーが発生しています。

List<? extends SortKey> sortKeys = new ArrayList(); 

これにより、警告ArrayList is a raw type. References to generic type ArrayList<E> should be parameterizedが発生しました。私はいくつかの研究を行い、これらの質問を見つけました - Collections of generics “Cannot instantiate the type ArrayList”How can elements be added to a wildcard generic collection?。だから私はpublic Listを次のように構築しました。

public <T extends SortKey> List<T> sortKeys() { 
    List<SortKey> keys = new ArrayList<SortKey>(); 
    keys.add(new RowSorter.SortKey(0, SortOrder.ASCENDING)); 
    keys.add(new RowSorter.SortKey(1, SortOrder.ASCENDING)); 
    return keys; 
} 

しかし、このコードをコンパイルしようとすると、エラーType mismatch: cannot convert from List<RowSorter.SortKey> to List<T>が発生します。このエラーを修正するにはどうすればよいですか?


私はまた、コード、List<? extends SortKey> sortKeys = new ArrayList<>();の行は、警告が削除されますが、私はなぜ理解していないことが判明
注意?誰かがそれを説明したり、私がそれを理解できるようにするために何かを参照する時間がかかった場合、私は感謝します。


編集
次のコードを使用して、エラーを修正します。

public <T extends SortKey> List<T> sortKeys() { 
    List<T> keys = new ArrayList<T>(); 
    keys.add((T) new RowSorter.SortKey(0, SortOrder.ASCENDING)); 
    keys.add((T) new RowSorter.SortKey(1, SortOrder.ASCENDING)); 
    return keys; 
} 

ただし、状態がType safety: Unchecked cast from RowSorter.SortKey to Tの新しい警告が生成されます。

+0

'T extends SortKey'は、実際には' SortKey'とは異なり、型が 'SortKey'(subtype)から派生しなければならないことをコンパイラに指示します。関数が 'List 'を返すので、 'List 'を返すことはできません。 'keys'(' List ')を返すので、エラーが発生しています。 –

+0

'List <? SortKey> sortKeys = new ArrayList() 'エラーを返すので、型引数を決して指定しないで、そのまま生かせます(ArrayList と同じです)。変数は型引数を指定するので、その値も同様に(あるいは少なくともそれを推論する)必要があります。 'new ArrayList <>()'を実行すると、推論で型を指定できます –

+0

あなたのメソッドが一般的なのはなぜですか? 'List 'を返すのはなぜですか? –

答えて

1

最初の質問では、new ArrayList() - >new ArrayList<>()に一般的な中カッコがありません。

2番目の質問では、リストタイプとしてSortKey(もちろんSortKeyから拡張されていない)を使用しようとしています。

スーパークラスタイプでサブクラスを保存できるので、そのように保管している理由はわかりません。

+3

"Generic braces"正しい用語は[diamond operator]です(http://stackoverflow.com/questions/4166966/what-is-the-point-of-the-diamond-operator-in-java-7 )。 – bcsb1001

+0

ダイヤモンド演算子はJDK 7で実装されました。コンパイラが型を参照するためにジェネリックの中カッコを空のままにする機能を示します。この場合、私は置換することができましたが、全体として中カッコを言及するための正しい用語であるとは思わなかった。 –

+1

@ bcsb1001正しい用語は、[JLS](https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1)に従って、実際には「*角かっこ*」です。 2)。 AFAIK、スペックはダイアモンドオペレーターとして決してそれらを参照しません。 –

関連する問題