具有较低有界(超级)类型的Java方法

时间:2016-11-09 12:03:34

标签: java generics methods parameters wildcard

例如,我有下一个类,带有有界类型参数:

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解释它。

1 个答案:

答案 0 :(得分:1)

你是对的,Java不允许这样做,因为两个实例虽然具有相同的超级,但可能不是同一类,因此避免了运行时异常。由于您确定它们将始终属于同一类,为什么不在itemContainer和items中使用相同的Type?

    ItemContainer<T> itemContainer = new ItemContainer<>();
    List<T> items = new ArrayList<>();