我正在尝试创建一个对象列表,这些对象是模型对象的扩展。实例是使用给定的 Class 对象创建的。
public class ModelFactory {
public static final List< ? extends Model > createList( final int pLength,
final Class< ? extends Model > pModelClass ) {
List< Model > models = new ArrayList< Model >( pLength );
try {
for ( int i = 0; i < pLength; i++ ) {
Model model = pModelClass.newInstance();
models.add( i, model );
}
} catch ( InstantiationException e ) {
} catch ( IllegalAccessException e ) {
}
return models;
}
}
当我尝试调用该方法时,一切正常。不过,我确实收到了警告,但我现在将其抑制。
@SuppressWarnings( "unchecked" )
List< CarModel > list = ( List< CarModel > ) ModelFactory.createList(
4, CarModel.class );
你们中有人知道消除此警告的解决方案吗?
最佳答案
您可以通过给类型命名来摆脱它,例如
public static final <T extends Model> List<T> createList( final int pLength,
final Class<T> pModelClass ) {
List< T > models = new ArrayList< T >( pLength );
...
}
当 T
时,这会变得有点困惑。本身是通用的,但只要它不是通用的,这就会为您提供额外的类型安全性。现在,您实际上不保证您返回的列表包含您放入的类型的对象(这就是您需要强制转换的原因)。
所以在你的代码中,第一个 ? extends Model
第二个? extends Model
不是同一类型。根据经验,?
总是独一无二的。事实上,您的代码将始终返回 List<Model>
,与您通过的实际类(class)无关。
然后您应该能够像这样使用它:
List< CarModel > list = ModelFactory.createList( 4, CarModel.class );
请注意,我不仅消除了警告,还消除了强制转换。
关于java - @SuppressWarnings( "unchecked") 使用通用通配符时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8961891/