【问题标题】:Limit generic type in subinterface in Java限制Java子接口中的泛型类型
【发布时间】:2014-01-30 12:57:54
【问题描述】:

假设我有这个接口结构:

public interface ItemRequestConverter<IR extends ItemRequest> {
    Target convert(IR request);
}

public interface CreateItemRequestConverter<CIR extends CreateItemRequest>
    extends ItemRequestConverter<ItemRequest> {
}

public class CreatePartRequestConverter implements CreateItemRequestConverter<CreatePartRequest> {
    @Override
    public Target convert(CreatePartRequest request) {
        ...
    }
}

现在我想知道这是否可能。我不信。 当我创建CreatePartRequestConverter 时,重写方法的签名是超类型ItemRequest。这是不希望的。

【问题讨论】:

  • 你能解释一下你想要达到的目标吗?我不太明白。
  • 为什么不扩展ItemRequestConverter&lt;CIR&gt;

标签: java generics interface


【解决方案1】:

我认为您的 CreateItemRequestConverter 类签名应该是这样的:

interface CreateItemRequestConverter<CIR extends CreateItemRequest>
        extends ItemRequestConverter<CIR> {

}

测试:

interface ItemRequestConverter<IR extends ItemRequest> {
    Target convert(IR request);
}

interface CreateItemRequestConverter<CIR extends CreateItemRequest>
        extends ItemRequestConverter<CIR> {

}

class CreatePartRequestConverter implements CreateItemRequestConverter<CreatePartRequest> {
    @Override
    public Target convert(CreatePartRequest request) {
        return null;
    }
}

class ItemRequest {
}

class CreateItemRequest extends ItemRequest {
}

class CreatePartRequest extends CreateItemRequest {
}

class Target {
}

【讨论】:

  • 愚蠢的我,这太完美了!谢谢奥利维尔!
【解决方案2】:

所以你想让被覆盖的方法接受一个扩展 ItemRequest 的泛型类型?您需要使用通用方法,例如:

<T extends ItemRequest> Target convert(T request);

【讨论】:

    猜你喜欢
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多