在这个返回 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
。