WildCard for Object<String> in Java6

时光总嘲笑我的痴心妄想 提交于 2019-12-12 18:25:27

问题


Please how to correct casting and remove warning

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

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

EDIT:

Warning came from code lines

1.(codeline 70.th)

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

2.(codeline 71.th)

Color color = getItemColor((T) value);

3.(codeline 76.th)

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

回答1:


The warning is there because the compiler can not ensure that a ClassCastException won't be thrown. In this case, the following would cause an exception.

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

While it is not likely that you will write code that blatantly goes against the intent of the class you wrote, the compiler is warning you that this code could be misused.

The way you can hide the errors is to add @SuppressWarnings("unchecked") to getListCellRendererComponent. This tells the compiler that you know there are risks, but you don't want them to be reported as a warning.



来源:https://stackoverflow.com/questions/11070688/wildcard-for-objectstring-in-java6

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!