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

具有下界(超)类型的Java方法,java,generics,methods,parameters,wildcard,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();

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

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{
无效附加项(列表项);
}
以及在另一个具有参数的类中的用法:

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您是对的,Java不允许这样做,因为两个实例虽然具有相同的super,但可能不属于相同的类,因此可以避免运行时异常。既然您确定它们将始终属于相同的类,为什么不在ItemContainer和items中使用相同的类型

    ItemContainer<T> itemContainer = new ItemContainer<>();
    List<T> items = new ArrayList<>();
ItemContainer ItemContainer=newitemcontainer();
列表项=新建ArrayList();

因为itemContainer和items的泛型类型参数应该是T的超类型(在类标题中定义)。@DenisDorohov:“T的超类型”没有“the”
T的超类型
?super T
意味着它可以是
T
的超类型的任何类型,包括
T
本身、
T
的直接超类、该类的超类等(包括任何实现的接口等),一直到
对象。