在这个返回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();
}
答案 0 :(得分:0)
类型参数实际上仅对呼叫站点有用(+/-少数情况)。在type参数的范围内,类型基本上是它的边界。因此,虽然SpiffyCombo
符合C
的范围,但并非C
绑定的每种可能类型都是SpiffyCombo
。因此,编译器不允许您交替使用值。
您似乎希望实现类似
的目标abstract class HellaSpiffyComponent extends Component implements SpiffyComponent {}
public static HellaSpiffyComponent createSomethingSpiffy(Object... params) {...}
并使相应的类扩展HellaSpiffyComponent
,而不是扩展Component
并实施SpiffyComponent
。