使用通用通配符时@SuppressWarnings(“未选中”)

时间:2012-01-22 14:46:19

标签: java generics

我正在尝试创建一个对象列表,它是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 );

你们中的任何人都知道摆脱这个警告的解决方案吗?

2 个答案:

答案 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;
    }
}