在Java中限制子接口中的泛型类型

时间:2014-01-30 12:57:54

标签: java generics interface

说我有这个界面结构:

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。这是不可取的。

2 个答案:

答案 0 :(得分: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 {
}

答案 1 :(得分:0)

所以你想让重写的方法接受扩展ItemRequest的泛型类型?您将需要使用通用方法,例如:

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