【问题标题】:Bound mismatch with Java Generics "nesting"与 Java 泛型“嵌套”的绑定不匹配
【发布时间】:2012-12-28 06:40:24
【问题描述】:

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

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&lt;ADataDto&gt;BSetDto&lt;BDataDto&gt;AResults&lt;ASetDto&gt;BResults&lt;BSetDto&gt;,我想确保一个类不能以类似AMyProblemInterface&lt;ADataDto, ASetDto, BResults&gt; 的方式实现 MyProblemInterface。我认为既然MySetDto 扩展SetDto&lt;MyDataDto&gt; 就好了,我可以继续更进一步,但我显然错了。

感谢您的帮助。

【问题讨论】:

  • 尝试将结果声明更改为 Results&lt;MySetDto extends SetDto&lt;? extends DataDto&gt;&gt; - 不确定我的语法是否正确,但如果您说 SetDto 那么它希望看到确切的通用签名。

标签: java generics


【解决方案1】:

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

如下声明你的接口会更简单:

public interface MyProblemInterface<MyDataDto extends DataDto>

然后强制方法使用SetDto&lt;MyDataDto&gt;Results&lt;MySetDto&gt;

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

【讨论】:

    【解决方案2】:

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

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

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多