请如何纠正施法并删除警告
[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));
答案 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
。这告诉编译器您知道存在风险,但您不希望将它们报告为警告。