Java 三元条件算子中的不相容类型
我正在尝试根据特定条件为下拉框设置自定义渲染器:Java 三元条件算子中的不相容类型,java,generics,java-7,conditional-operator,Java,Generics,Java 7,Conditional Operator,我正在尝试根据特定条件为下拉框设置自定义渲染器: themeComboBox.setRenderer( settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer()); 其中themembobox是javax.swing.JComboBox的一个实例,themeNameReferender是一个扩展DefaultListCellRenderer的自定义类 这不会编译,出现以下错误 method setR
themeComboBox.setRenderer(
settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer());
其中themembobox
是javax.swing.JComboBox
的一个实例,themeNameReferender
是一个扩展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
似乎他们对Java8中的类型推断添加了一些改进,这可能解释了行为上的差异 检查本页中的“目标类型”部分: 什么是目标类型的概念已经扩展到包括方法参数 这段代码使用Java 1.7编译得很好(需要添加强制转换):
似乎他们对Java8中的类型推断添加了一些改进,这可能解释了行为上的差异 检查本页中的“目标类型”部分: 什么是目标类型的概念已经扩展到包括方法参数 这段代码使用Java 1.7编译得很好(需要添加强制转换):
themeComboBox.setRenderer((ListCellRenderer)我认为您必须将参数强制转换为适当的类型。是否尝试settings==null?(ListCellRenderer@PaulBoddington我试过了,但不起作用。@AnkitDeshpande啊,这是关键!我试过按照Paul的建议使用这两个参数,但不是全部。三元运算符有时在java中会出现意外行为。您可以搜索它,stackoverflow也有一些问题。Themembobox.setRenderer((ListCellRenderer我认为必须将参数强制转换为适当的类型。是否尝试settings==null?(ListCellRenderer@PaulBoddington我试过了,但不起作用。@AnkitDeshpande啊,这是关键!我试过按照Paul的建议使用这两个参数,但不是全部。三元运算符有时在java中表现得出人意料。你可以搜索它,stackoverflow也有一些问题。你是对的,它起作用了!你知道为什么会这样吗在Java1.7下是必要的吗?你是对的,这很有效!你知道为什么在Java1.7下是必要的吗?
themeComboBox.setRenderer(pickRenderer());
private ListCellRenderer<? super Path> pickRenderer() {
if (settings == null) {
return themeComboBox.getRenderer();
} else {
return new ThemeNameRenderer();
}
}
themeComboBox.setRenderer(
(ListCellRenderer<? super Path>) (settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer()));
themeComboBox.setRenderer(
settings == null ? themeComboBox.getRenderer() : new ThemeNameRenderer());