【发布时间】:2019-10-15 22:31:28
【问题描述】:
我有一个通用接口定义为:
public interface ItemService<T extends Slicer, E extends ItemSlice> {
E getItemHistory(final String id, final T slicer);
}
还有一个实现:
public class DynamoDbItemService implements ItemService<DynamoDbSlicer, DynamoDbItemSlice> {
public DynamoDbItemSlice getItemHistory(final String id, final DynamoDbSlicer slicer) {
}
}
下面是上面提到的四个类的定义:
public interface Slicer {
Map<String, ? extends Serializable> pointer();
}
public class DynamoDbSlicer implements Slicer {
public Map<String, AttributeValue> pointer() {
}
}
public interface ItemSlice extends Slice<Item> {
}
public interface Slice<T> {
List<T> data();
Slicer next();
}
public class DynamoDbItemSlice implements ItemSlice {
publi ImmutableList<Item> data() {}
public DynamoDbSlicer next() {}
}
我想引用ItemService 接口,但它要绑定到DynamoDbItemService 实现,所以我可以在必要时将其换掉,我可以这样做:
ItemService<? extends Slicer, ? extends ItemSlice> itemService = new DynamoDbItemService itemService();
但如果我尝试像这样使用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
我从this question 了解到,? 通配符不能相同,所以我的问题是 - 我可以做我想做的事 - 使用界面吗?如果是这样,怎么做?还是我处理不当?
【问题讨论】:
-
如果我们能得到所有相关的方法来调试它会很好。您在那里缺少很多方法,最值得注意的是
DynamoDbSlicer.first()。
标签: java generics inheritance types