Java 7 を使用しているため、警告をスローする古いコードを使用しています。Eclipse で多くのタイプ セーフ警告を生成する次のメソッドがあります。ほとんどの場合、解決策はかなり簡単ですが、問題に対するデフォルトの Eclipse 修正はコンパイル エラーを引き起こします。
public static JList list(ListModel listModel, ListCellRenderer cellRenderer) {
JList list = new JList();
if (cellRenderer != null) {
list.setCellRenderer(cellRenderer);
}
else {
list.setCellRenderer(new CustomeListCellRenderer());
}
list.setModel(listModel);
if (listModel != null) {
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
return list;
}
Eclipse はこれを次のように変更します。
public static JList<?> list(ListModel<?> listModel, ListCellRenderer<?> cellRenderer) {
JList<?> list = new JList<Object>();
if (cellRenderer != null) {
list.setCellRenderer(cellRenderer);
}
else {
list.setCellRenderer(new CustomeListCellRenderer());
}
list.setModel(listModel);
if (listModel != null) {
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
return list;
}
これにより、次のエラーが発生します。
The method setCellRenderer(ListCellRenderer<? super capture#4-of ?>) in the type JList<capture#4-of ?> is not applicable for the arguments (ListCellRenderer<capture#5-of?>)
と
The method setModel(ListModel<capture#7-of ?>) in the type JList<capture#7-of ?> is not applicable for the arguments (ListModel<capture#8-of ?>)
これの原因を突き止めるには、ジェネリックを十分に理解していないように感じます。型引数の数を ? から変更してみました。これはコンパイル エラーを解決しますが、実際には Object 型の JList を返したくありません。ヒントをいただければ幸いです。
編集:メソッド全体を次のように一般化しました。
public static <T> JList<T> list(ListModel<T> listModel, ListCellRenderer<T> cellRenderer) {
JList<T> list = new JList<T>();
if (cellRenderer != null) {
list.setCellRenderer(cellRenderer);
}
else {
list.setCellRenderer(new CustomeListCellRenderer());
}
list.setModel(listModel);
if (listModel != null) {
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
}
return list;
}
これは、メソッドを更新する適切な方法のように思えますか?