对于以下情况,假设AModel.class扩展了ABCModel,则情况1
案例1有效
public static Class<? extends ABCModel> getModel(String objectModel) {
if(objectModel.equalsIgnoreCase("")) {
return AModel.class;
}
return null;
}
情况2(引发编译错误)
public static <T extends ABCModel> Class<T> getModel(String objectModel) {
if(objectModel.equalsIgnoreCase("")) {
return AModel.class;
}
return null;
}
目的是不一样的吗?
在第二种情况下,您将约束类型变量T
以扩展ABCModel
并承诺返回Class<T>
。但是,它们T
并没有绑定在任何地方,因此在编译期间无法确定是什么T
。
示例1中的区别在于,返回类型定义为Class<? extends ABCModel>
,其上限为ABCModel
。
T
在第二种情况下,在编译时进行绑定的一种方法是将其作为方法的参数,例如:
public static <T extends ABCModel> Class<T> getModel(String objectModel, Class<T> clazz) {
现在T
根据传递给方法的参数进行绑定(这就是为什么您看到很多通用方法都包含Class
参数的原因)。
当然,这对您的方法无济于事,因为您想检索Class
,如果已经传递了它就没有必要。但这仅意味着您应该使用示例1或修复设计。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句