问题
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