我试图根据特定条件为下拉框设置自定义呈现器:
themeComboBox.setRenderer(
settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer());其中themeComboBox是javax.swing.JComboBox<Path>的一个实例,ThemeNameRenderer是扩展DefaultListCellRenderer的自定义类。
这不编译,有以下错误
method setRenderer in class JComboBox<E> cannot be applied to given types;
themeComboBox.setRenderer(settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer());
required: ListCellRenderer<? super Path>
found: ListCellRenderer<CAP#1>
reason: actual argument ListCellRenderer<CAP#1> cannot be converted to ListCellRenderer<? super Path> by method invocation conversion
where E is a type-variable:
E extends Object declared in class JComboBox
where CAP#1 is a fresh type-variable:
CAP#1 extends Object from capture of ? extends Object如何使用条件运算符?
setRenderer的调用,因为我正在通过NetBeans GUI编辑器定制代码。事实上,我需要这样做的全部原因是ThemeNameRenderer使用了在编辑器中设计GUI时不应该加载的依赖项。发布于 2015-10-24 20:20:12
他们似乎为Java 8中的类型推断增加了一些改进,这可能解释了行为上的差异。
请查看本页中的“目标类型”部分:
https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html
什么是目标类型的概念已经扩展到包括方法参数。
使用Java1.7(需要添加强制转换),这段代码对我来说编译得很好:
themeComboBox.setRenderer(
(ListCellRenderer<? super Path>) (settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer()));您的原始代码使用Java 1.8进行了很好的编译:
themeComboBox.setRenderer(
settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer());https://stackoverflow.com/questions/33322788
复制相似问题