繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM