Limit generic type in subinterface in Java

与世无争的帅哥 提交于 2020-01-25 11:41:06

问题


Say I have this interface structure:

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) {
        ...
    }
}

Now I wondering whether this is possible at all. I doubt that. When I create CreatePartRequestConverter the signature of the overridden method is the super type ItemRequest. This is not desired.


回答1:


I think your CreateItemRequestConverter class signature should be like this :

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

}

Test :

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:


So you want to make the overridden method accept a generic type that extends ItemRequest? You'll want to use a generic method, e.g:

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


来源:https://stackoverflow.com/questions/21457226/limit-generic-type-in-subinterface-in-java

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!