返回泛型扩展两种类型的工厂方法

时间:2014-12-03 22:37:21

标签: java generics factory multiple-inheritance

在这个返回Component并且还实现特殊接口的工厂中,我在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();
}

1 个答案:

答案 0 :(得分:0)

类型参数实际上仅对呼叫站点有用(+/-少数情况)。在type参数的范围内,类型基本上是它的边界。因此,虽然SpiffyCombo符合C的范围,但并非C绑定的每种可能类型都是SpiffyCombo。因此,编译器不允许您交替使用值。

您似乎希望实现类似

的目标
abstract class HellaSpiffyComponent extends Component implements SpiffyComponent {}

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

并使相应的类扩展HellaSpiffyComponent,而不是扩展Component并实施SpiffyComponent