1

违规行是:

public class InputField<W extends WidgetInterface>
                             extends InputFieldArray<W extends WidgetInterface>

如您所见,我正在尝试将泛型类型 ( InputFieldArray) 扩展到另一个泛型类型 ( InputField)。泛型类型参数W在这两种情况下都是WidgetInterface接口的实现。

如果我这样做,编译器会抱怨它期待 a >after the second W。好的,也许编译器足够聪明,我可以这样写:

public class InputField<W extends WidgetInterface> extends InputFieldArray<W>

但是,如果我这样做,编译器会抱怨第二个W“不在其范围内”。我怎么了?

4

2 回答 2

4

编译器抱怨是对的。

您说过泛型参数 toInputFieldArray必须是 and 的子Component WidgetInterface。但是,您试图声明InputField它只接受一个参数,即 a WidgetInterface

这无法编译,否则有人可以使用InputField不是Component. 这与它的超类不一致——类型安全会被破坏(在运行时强制转换会失败),这会破坏泛型的全部意义。

您需要在子类中应用相同的约束(或更严格):

public class InputField<W extends Component & WidgetInterface>
             extends InputFieldArray<W>
于 2013-08-15T14:22:15.680 回答
2

根据您的评论,您应该这样做:

public class InputField<W extends Component & WidgetInterface>
extends InputFieldArray<W>

编译器错误是不言自明的:没有给出andW的上限,它作为 的类型参数不在其范围内。ComponentWidgetInterfaceInputFieldArray

您的第一个片段只是一个语法错误:您只在声明时指定了类型参数的边界。

于 2013-08-15T14:21:30.697 回答