Java反射 - 构造对象&添加到列表

时间:2015-12-27 22:21:38

标签: java

使用此签名的方法构造类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();

但语法错误。

2 个答案:

答案 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>的列表中。