与Java Generics“嵌套”绑定不匹配

时间:2012-12-27 21:57:38

标签: java generics

我在使用泛型进行重新设计/重构时遇到了困难,我正在对现有设计进行操作。

public interface DataDto {
    // some data here
}

public interface SetDto<MyDataDto extends DataDto> {
    List<MyDataDto> getData();
}

public interface Results<MySetDto extends SetDto<DataDto>> {
    MySetDto getResults();
}

public interface MyProblemInterface<MyDataDto extends DataDto,
        MySetDto extends SetDto<MyDataDto>,
        MyResults extends Results<MySetDto>> {
    // some stuff here
}

我的问题是我收到了MyProblemInterface的以下错误:

Bound mismatch: The type MySetDto is not a valid substitute for the
bounded parameter <MySetDto extends SetDto<DataDto>> of the type
Results<MySetDto>

我承认我对泛型的经验有些限制,但基本上我试图强制MyProblemInterface中的所有三种类型都是相同的“类型”。例如,如果我有ADataDtoBDataDtoASetDto<ADataDto>BSetDto<BDataDto>AResults<ASetDto>BResults<BSetDto>,我想确保课程可以'以类似AMyProblemInterface<ADataDto, ASetDto, BResults>的方式实现MyProblemInterface。我认为,由于MySetDto延伸SetDto<MyDataDto>就好了,我可以继续采取进一步的措施,但我显然是错的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

你想从Java泛型中获得太多。

将接口声明为以下内容会更简单:

public interface MyProblemInterface<MyDataDto extends DataDto>

然后强制方法使用SetDto<MyDataDto>Results<MySetDto>

通过在类/接口声明中使用泛型,可以指定某种变体,这在后面的定义中确定。但在您的情况下,您说SetDtoResults将始终以MyDataDto作为参数,因此没有变化。

答案 1 :(得分:0)

不应该是这样的,只有在实现接口时才添加实际的类。

更新了代码,因为我忘了添加正确的结果定义。这应该有用。

public interface DataDto {
    // some data here
}

public interface SetDto<T extends DataDto> {
    List<T> getData();
}

public interface Results<T extends SetDto<? extends DataDto>> {
    T getResults();
}

public interface MyProblemInterface<T extends DataDto, E extends SetDto<T>, K extends Results<E>> {
    // some stuff here
}