对象的通配符<;字符串>;在Java6中

对象的通配符<;字符串>;在Java6中,java,swing,generics,wildcard,jcombobox,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 =

请说明如何纠正铸造和消除警告

[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;
    }
}
2.(第71行代码)

3.(第76行代码)


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

FlexiComboBox<Integer> box = new FlexiComboBox<Integer>();
box.addItem("BAD ITEM");
//then add the combobox to a panel and display it.
FlexiComboBox=new FlexiComboBox();
方框.附件(“坏项”);
//然后将组合框添加到面板并显示它。
虽然您编写的代码不太可能公然违背您编写的类的意图,但编译器警告您此代码可能被误用


隐藏错误的方法是将
@SuppressWarnings(“未选中”)
添加到
GetListCellRenderComponent
。这会告诉编译器您知道存在风险,但您不希望将其报告为警告。

您在哪一行得到警告?您确定此代码给出了警告吗??它没有给我任何警告…问题是我认为它无法修复。您正在强制转换为您不知道的泛型类型(t)。据我所知,@SuppressWarning(“unchecked”)一定是…@Thihara我认为可能,我在那里看到了另一个woodoo,这可能是Generecs和Java7的先决条件。为什么要将它们转换为T?难道不可能不用演员吗?我不知道这些方法在做什么,但在我看来,您应该能够在没有强制转换的情况下执行诸如getItemIcon()、getItemColor()之类的操作。如果您依赖于某种实现方法,那么您最好在那里使用一个接口。。。或者限制类型T.+1,作为答案,我认为我理解这个问题(在
泛型
&
反射
中不太好)我的问题是如何正确地强制转换,例如
@mKorbel:unchecked强制转换有时是不可避免的,就像在这种情况下,您在运行时没有
T
,所以不可能在那个里检查它function@newacct我真的希望你也不是对的,这就是我问这个问题的原因,事实上我从未见过Java中不可避免的强制转换,但事实上我也避免使用Java7。。。
Color color = getItemColor((T) value);
((JLabel) result).setIcon(getItemIcon((T) value));
FlexiComboBox<Integer> box = new FlexiComboBox<Integer>();
box.addItem("BAD ITEM");
//then add the combobox to a panel and display it.