对象的通配符<;字符串>;在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.