有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

具有下界(超)类型的泛型Java方法

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

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) 个答案

  1. # 1 楼答案

    您是对的,Java不允许这样做,因为两个实例虽然有相同的super,但可能不属于同一个类,因此避免了运行时异常。既然您确定它们总是属于同一类,为什么不在itemContainer和items中使用相同的类型呢

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