问题
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