繁体   English   中英

与Java泛型“嵌套”的绑定不匹配

[英]Bound mismatch with Java Generics “nesting”

我在现有设计中使用泛型进行重新设计/重构时遇到困难。

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>的方式实现AMyProblemInterface<ADataDto, ASetDto, BResults> 我认为,由于MySetDto扩展了SetDto<MyDataDto>很好,所以我可以继续SetDto<MyDataDto> ,但是我显然错了。

感谢您的任何帮助。

您想从Java泛型中获得太多帮助。

声明接口如下所示会更简单:

public interface MyProblemInterface<MyDataDto extends DataDto>

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

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

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

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

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM