[英]Java Reflection - Construct Object & Add to List
具有此签名的方法构造类objClass
的对象,该对象位于BaseModel
层次结构中的某个BaseModel
,并将其添加到列表中? extends 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();
但那种语法是错误的。
编译器无法知道?
是同一类的类。
您需要使方法本身通用,以便您可以实际引用该类型:
public <T extends BaseModel> void constructAndAdd(List<? super T> list, Class<? extends T> objClass) {
list.add(objClass.newInstance());
}
一旦你这样做,你根本不需要任何演员阵容。
List<? extends BaseModel> list
List<? extends BaseModel> list
可以保存List<? extends BaseModel> list
的任何类型元素的列表。 所以假设用户传递给它的FooBaseModel
元素列表,其中FooBaseModel
是扩展BaseModel
类,但引入了一些额外的字段/方法。 如果我们可以将任何 BaseModel
添加到该列表中,那么现在是否安全?
不,因为我们使用list.get();
,我们希望它返回FooBaseModel
实例,我们可以安全地调用这些附加方法。
另一个问题是objClass.newInstance()
可以返回扩展BaseModel
其他类型,但行为方式与FooBaseModel
预期的方式不同。
所以你不能添加任何元素到列表定义为List<? extends OtherType>
List<? extends OtherType>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.