我正在尝试创建一个对象列表,它是Model对象的扩展。使用给定的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 );
你们中的任何人都知道摆脱这个警告的解决方案吗?
答案 0 :(得分:2)
你可以通过给类型命名来消除它,例如
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>
,与您传递的实际类无关。
然后您应该能够像这样使用它:
List< CarModel > list = ModelFactory.createList( 4, CarModel.class );
请注意,我不仅清除了警告,还清除了警告。
答案 1 :(得分:1)
public class Model {}
public class CarModel extends Model {}
public class Foo {
void bar() {
List< CarModel > list = ModelFactory.createList(
4, CarModel.class );
}
}
public class ModelFactory {
public static final <T extends Model> List<T> createList( final int pLength,
final Class< T > pModelClass ) {
List< T > models = new ArrayList< T >( pLength );
try {
for ( int i = 0; i < pLength; i++ ) {
T model = pModelClass.newInstance();
models.add( i, model );
}
} catch ( InstantiationException e ) {
} catch ( IllegalAccessException e ) {
}
return models;
}
}