如何将有界泛型类型扩展为另一个有界泛型类型?

时间:2013-08-15 14:15:18

标签: java generics

违规行是:

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'不在其范围内'。我错了什么?

2 个答案:

答案 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 ComponentWidgetInterface的上限,它不在InputFieldArray的类型参数的范围内

您的第一个代码段只是语法错误:您只在声明时指定类型参数的范围。