在这个返回 Component 的工厂中,它也实现了一个特殊的接口(interface),我在 createSomethingSpiffy 中收到错误“类型不匹配:无法从 SpiffyCombo 转换为 C”。

我做错了什么,还是我必须在这里将 SpiffyCombo 转换为 C

class Factory {
    public static <C extends Component & SpiffyComponent> C createSomethingSpiffy(Object... params) {
        C comp = new SpiffyCombo();
        // real method will be more complex
        return comp;
    }
}

class SpiffyTextField extends Component implements SpiffyComponent {
    public void wow() { ... }
}

class SpiffyCombo extends JComboBox implements SpiffyComponent {
    public void wow() { ... }
}

interface SpiffyComponent {
    void wow();
}

最佳答案

类型参数实际上只对调用站点有用(+/- 少数情况)。在类型参数的范围内,类型基本上是它的边界。因此,尽管 SpiffyCombo 符合 C 的边界,但并非所有绑定(bind)到 C 的可能类型都是 SpiffyCombo 。因此,编译器不能让您交替使用任何一个的值。

你似乎想要实现类似的东西

abstract class HellaSpiffyComponent extends Component implements SpiffyComponent {}

public static HellaSpiffyComponent createSomethingSpiffy(Object... params) {...}

并使您的相应类扩展 HellaSpiffyComponent 而不是扩展 Component 并实现 SpiffyComponent

10-08 19:17