Java6中的WildCard for Object <string> </string>

时间:2012-06-17 10:40:49

标签: java swing generics wildcard jcombobox

请如何纠正施法并删除警告

[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.th)

Color color = getItemColor((T) value);

3.(代码行76.th)

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

1 个答案:

答案 0 :(得分: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。这告诉编译器您知道存在风险,但您不希望将它们报告为警告。