2

キャストを修正して警告を削除する方法を教えてください

[unchecked] unchecked cast
required:   T
found:      java.lang.Object

SSCCEから

import java.awt.*;
import javax.swing.*;

public class JComboBoxWithWildCard {

    private JDialog dlg = new JDialog();
    private final Icon errorIcon = UIManager.getIcon("OptionPane.errorIcon");

    public JComboBoxWithWildCard() {
        JComboBox comboWithCustomRenderer = new FlexiComboBox<String>(
                "1 one", "2 two", "3 three", "4 four", "5 five", "6 six",
                "7 seven", "8 eight", "9 nine", "10 ten", "11 eleven") {

            private static final long serialVersionUID = 1L;

            @Override
            public String getCaption(String item) {
                return item;
            }

            @Override
            public Icon getItemIcon(String item) {
                return errorIcon;
            }
        };
        comboWithCustomRenderer.setPrototypeDisplayValue("XXXXXXXXXXXXXXXXXXX");
        comboWithCustomRenderer.setMaximumRowCount(6);
        dlg.add(comboWithCustomRenderer);
        dlg.pack();
        dlg.setLocationRelativeTo(null);
        dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dlg.setVisible(true);
    }

    public static void main(String[] a_args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JComboBoxWithWildCard pd = new JComboBoxWithWildCard();
            }
        });
    }
}

abstract class FlexiComboBox<T> extends JComboBox {

    private static final long serialVersionUID = 1L;

    public FlexiComboBox(T... items) {
        super(items);
    }

    @Override
    public void updateUI() {
        setRenderer(new DefaultListCellRenderer() {

            private static final long serialVersionUID = 1L;

            @Override
            public Component getListCellRendererComponent(JList list, Object value,
                    int index, boolean isSelected, boolean cellHasFocus) {
                Component result = super.getListCellRendererComponent(list,
                        getCaption((T) value), index, isSelected, cellHasFocus);
                Color color = getItemColor((T) value);
                if (color != null) {
                    result.setBackground(color);
                }
                if (result instanceof JLabel) {
                    ((JLabel) result).setIcon(getItemIcon((T) value));
                }
                return result;
            }
        });
        super.updateUI();
    }

    public abstract String getCaption(T item);

    public Color getItemColor(T item) {
        return null;
    }

    public Icon getItemIcon(T item) {
        return null;
    }
}

編集:

警告はコード行から来ました

1.(コードライン 70.th)

Component result = super.getListCellRendererComponent(list,
       getCaption((T) value), index, isSelected, cellHasFocus);

2.(コードライン71番目)

Color color = getItemColor((T) value);

3.(コードライン 76.th)

((JLabel) result).setIcon(getItemIcon((T) value));
4

1 に答える 1

2

ClassCastExceptionコンパイラはがスローされないことを保証できないため、警告が表示されます。この場合、以下の場合は例外となります。

FlexiComboBox<Integer> box = new FlexiComboBox<Integer>();
box.addItem("BAD ITEM");
//then add the combobox to a panel and display it.

作成したクラスの意図に明らかに反するコードを作成する可能性は低いですが、コンパイラーは、このコードが悪用される可能性があることを警告しています。

エラーを非表示にする方法は、に追加する@SuppressWarnings("unchecked")ことgetListCellRendererComponentです。これは、リスクがあることはわかっているが、警告として報告されたくないことをコンパイラーに通知します。

于 2012-06-17T12:19:08.490 に答える