例如,我有下一个类,带有有界类型参数:
public class ItemContainer<T> {
void addItems(List<T> items);
}
使用参数:
的另一个类public class ItemsGenerator<T> {
public void putItems() {
ItemContainer<? super T> itemContainer = getItemContainer();
List<? super T> items = getItems();
itemContainer.addItems(items); // compilation error!
}
}
根据我的理解,问题是不知道第一个(ItemContainer)泛型参数是否与第二个(List)相同。好的解决方案可能是为方法定义通用下限类型:
public <S super T> void putItems() {
ItemContainer<S> itemContainer = getItemContainer();
List<S> items = getItems();
itemContainer.addItems(items); // ok
}
但令人惊讶的是(就我而言),没有这样的语法( slightly unconvincing reason)! 有什么方法可以解决这个问题吗?我确信(在我的情况下)第一个和第二个参数是相同的,但我不知道如何向Java解释它。
答案 0 :(得分:1)
你是对的,Java不允许这样做,因为两个实例虽然具有相同的超级,但可能不是同一类,因此避免了运行时异常。由于您确定它们将始终属于同一类,为什么不在itemContainer和items中使用相同的Type?
ItemContainer<T> itemContainer = new ItemContainer<>();
List<T> items = new ArrayList<>();