Java 泛型接口和实现-无法转换类型

Java 泛型接口和实现-无法转换类型,java,generics,inheritance,types,Java,Generics,Inheritance,Types,我有一个通用接口,定义为: public interface ItemService<T extends Slicer, E extends ItemSlice> { E getItemHistory(final String id, final T slicer); } 但是如果我试着像这样使用itemService: ItemSlice slice = itemService.getItemHistory(itemId, DynamoDbSlicer.first(1))

我有一个通用接口,定义为:

public interface ItemService<T extends Slicer, E extends ItemSlice> {
    E getItemHistory(final String id, final T slicer);
}
但是如果我试着像这样使用
itemService

ItemSlice slice = itemService.getItemHistory(itemId, DynamoDbSlicer.first(1));
slice = itemService.getItemHistory(itemId, slice.next());
我发现以下两个编译错误:

Error:(231, 82) java: incompatible types: item.pagination.DynamoDbSlicer cannot be converted to capture#1 of ? extends pagination.Slicer

Error:(238, 62) java: incompatible types: pagination.Slicer cannot be converted to capture#2 of ? extends pagination.Slicer
我了解到,
通配符不能完全相同,所以我的问题是-我能做我想做的吗-使用接口吗?如果是,怎么做?还是我处理得不对


我之前问过两个与此相关的问题,这两个问题在整个过程中起到了帮助作用(并且)

我看不出以下问题对您不起作用的原因:

ItemService<DynamoDbSlicer, DynamoDbItemSlice> itemService = new DynamoDbItemService();
ItemSlice slice = itemService.getItemHistory("",  new DynamoDbSlicer());
ItemService ItemService=new DynamoDbItemService();
ItemSlice slice=itemService.getItemHistory(“,new DynamoDbSlicer());
但是,如果您希望使代码尽可能模块化,您可以使用此方法执行未经检查的强制转换(有人说是纯粹的邪恶),并获得您想要的结果:

public static void main(String[] args) {

    ItemSlice slice = getMySlice(new DynamoDbItemService());
}

@SuppressWarnings("unchecked")
public static <T extends Slicer, E extends ItemSlice> E getMySlice(ItemService<T, E> service) {
    return service.getItemHistory("", (T) new DynamoDbSlicer());
}
publicstaticvoidmain(字符串[]args){
ItemSlice slice=getMySlice(新的DynamoDbItemService());
}
@抑制警告(“未选中”)
公共静态E getMySlice(项目服务){
return service.getItemHistory(“,(T)new DynamoDbSlicer());
}
当然,还有一种解决方案,将类型推断责任传递给存储值的实际字段。我自己也会选择这个解决方案,因为我认为它提供了最大的灵活性:

public class DynamoDbItemService<T extends Slicer, E extends ItemSlice> implements ItemService<T, E>

ItemService<DynamoDbSlicer, DynamoDbItemSlice> itemService = new DynamoDbItemService();
ItemSlice slice = itemService.getItemHistory("", new DynamoDbSlicer());
公共类DynamoDbItemService实现ItemService
ItemService ItemService=新的DynamoDbItemService();
ItemSlice slice=itemService.getItemHistory(“,new DynamoDbSlicer());

如果我们能得到所有相关的方法,那么我们就可以调试它了。这里缺少很多方法,最明显的是
DynamoDbSlicer.first()
ItemService<DynamoDbSlicer, DynamoDbItemSlice> itemService = new DynamoDbItemService();
ItemSlice slice = itemService.getItemHistory("",  new DynamoDbSlicer());
public static void main(String[] args) {

    ItemSlice slice = getMySlice(new DynamoDbItemService());
}

@SuppressWarnings("unchecked")
public static <T extends Slicer, E extends ItemSlice> E getMySlice(ItemService<T, E> service) {
    return service.getItemHistory("", (T) new DynamoDbSlicer());
}
public class DynamoDbItemService<T extends Slicer, E extends ItemSlice> implements ItemService<T, E>

ItemService<DynamoDbSlicer, DynamoDbItemSlice> itemService = new DynamoDbItemService();
ItemSlice slice = itemService.getItemHistory("", new DynamoDbSlicer());