具有下界(超)类型的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
的直接超类、该类的超类等(包括任何实现的接口等),一直到对象。