违规行是:
public class InputField<W extends WidgetInterface>
extends InputFieldArray<W extends WidgetInterface>
如您所见,我正在尝试将泛型类型(InputFieldArray
)扩展为另一种泛型类型(InputField
)。泛型类型参数W
在两种情况下都是有限的WidgetInterface
接口的实现。
如果我这样做,编译器会抱怨它在第二个>
之后期待W
。好吧,也许编译器很聪明,我可以这样写:
public class InputField<W extends WidgetInterface> extends InputFieldArray<W>
但是,如果我这样做,编译器会抱怨第二个W
'不在其范围内'。我错了什么?
答案 0 :(得分:4)
编译是抱怨的权利。
您已经说过InputFieldArray
的通用参数必须是Component
和 WidgetInterface
的子类。但是,您尝试声明InputField
仅采用WidgetInterface
的参数。
这无法编译,否则有人可能会创建一个InputField
,其参数不是Component
。并且这与它的超类不一致 - 类型安全性会被破坏(因为强制转换会在运行时失败),这会破坏整个泛型。
您需要在子类中应用相同的约束(或更严格):
public class InputField<W extends Component & WidgetInterface>
extends InputFieldArray<W>
答案 1 :(得分:2)
根据您的评论,您似乎应该这样做:
public class InputField<W extends Component & WidgetInterface>
extends InputFieldArray<W>
编译器错误是不言自明的:没有W
Component
和WidgetInterface
的上限,它不在InputFieldArray
的类型参数的范围内
您的第一个代码段只是语法错误:您只在声明时指定类型参数的范围。