以下のコード行があります。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
の新しい警告が生成されます。
'T extends SortKey'は、実際には' SortKey'とは異なり、型が 'SortKey'(subtype)から派生しなければならないことをコンパイラに指示します。関数が 'List'を返すので、 'List 'を返すことはできません。 'keys'(' List ')を返すので、エラーが発生しています。 –
'List <? SortKey> sortKeys = new ArrayList() 'エラーを返すので、型引数を決して指定しないで、そのまま生かせます(ArrayList
あなたのメソッドが一般的なのはなぜですか? 'List'を返すのはなぜですか? –