使用此签名的方法构造类objClass
的对象,该对象位于BaseModel
层次结构中的某个位置,并使用? extends BaseModel
个对象将其添加到列表中。
public void constructAndAdd(List<? extends BaseModel> list, Class objClass)
{
BaseModel newObject = (BaseModel)objClass.newInstance();
list.add(newObject);
}
错误:
The method add(capture#2-of ? extends BaseModel) in the type List<capture#2-of ? extends BaseModel> is not applicable for the arguments (BaseModel)
我希望我能做到
? extends BaseModel newObject = (? extends BaseModel)objClass.newInstance();
但语法错误。
答案 0 :(得分:5)
编译器无法知道public <T extends BaseModel> void constructAndAdd(List<? super T> list, Class<? extends T> objClass) {
list.add(objClass.newInstance());
}
与该类的类型相同。
您需要使方法本身具有通用性,以便您可以实际引用该类型:
Xdebug
一旦你这样做,你根本不需要任何演员阵容。
答案 1 :(得分:2)
List<? extends BaseModel> list
可以包含扩展BaseModel的任何类型元素的列表。因此,假设用户向其传递了FooBaseModel
元素列表,其中FooBaseModel
是扩展BaseModel
的类,但引入了一些其他字段/方法。现在,如果我们可以添加任何 BaseModel
列表,那么它会安全吗?
不,因为当我们使用list.get();
时,我们希望它返回FooBaseModel
的实例,我们可以安全地调用这些附加方法。
另一个问题是,objClass.newInstance()
可以返回扩展BaseModel
的其他类型,但其行为方式与FooBaseModel
不同。
因此,您无法将任何元素添加到定义为List<? extends OtherType>
的列表中。