2

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

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都是相同的“类型”。例如,如果我有ADataDto, BDataDto, ASetDto<ADataDto>, BSetDto<BDataDto>, AResults<ASetDto>, BResults<BSetDto>,我想确保一个类不能以类似的方式实现 MyProblemInterface AMyProblemInterface<ADataDto, ASetDto, BResults>。我认为既然MySetDto延伸SetDto<MyDataDto>得很好,我可以继续更进一步,但我显然错了。

感谢您的任何帮助。

4

2 回答 2

0

你对 Java 泛型的要求太多了。

将接口声明如下会更简单:

public interface MyProblemInterface<MyDataDto extends DataDto>

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

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

于 2012-12-27T22:13:13.390 回答
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
}
于 2012-12-27T22:29:20.660 回答