java - Java6 中对象 <String> 的通配符

标签 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 条)

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

2.(代码行第 71 行)

Color color = getItemColor((T) value);

3.(代码行第 76 行)

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

最佳答案

出现警告是因为编译器无法确保不会抛出ClassCastException。在这种情况下,以下内容将导致异常。

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

虽然您编写的代码不太可能公然违背您所编写的类的意图,但编译器会警告您此代码可能会被滥用。

隐藏错误的方法是将@SuppressWarnings("unchecked")添加到getListCellRendererComponent。这告诉编译器您知道存在风险,但您不希望将它们报告为警告。

关于java - Java6 中对象 <String> 的通配符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11070688/

相关文章:

java - JPanel闪烁问题

swift - Swift 函数中的泛型和协议(protocol)一致性

C11 类型泛型表达式 - 为什么不直接添加函数重载?

c# - 将具有反射/Cast 属性的泛型属性映射到泛型类型

java - jsoup是否下载CSS、JS和图片

java - 需要帮助查明 Java 遗传算法单点交叉机制中的问题

Java GUI 组件和面板对齐

java - 如何使 Swing JComponent 成为更大的鼠标目标?

java - 如何将 uuid 添加到 log4j 以登录文件?

java - 如何将图片添加到 javaFX 2.0 netbeans 项目