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());