2

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;
}

これは、メソッドを更新する適切な方法のように思えますか?

4

1 に答える 1

3

試す:

public static <E> JList<E> list(ListModel<E> listModel, ListCellRenderer<? super E> cellRenderer) {
    JList<E> 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;
}
于 2013-07-01T15:04:01.187 に答える