java - @SuppressWarnings( "unchecked") 使用通用通配符时

标签 java generics

我正在尝试创建一个对象列表,这些对象是模型对象的扩展。实例是使用给定的 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/

相关文章:

java - 在 DevMode 中运行 GWT 2.7 期间出现奇怪的错误

swift - 类型安全 swift NSEntityDescriptor insertNewObjectForEntityForName(_ :inManagedObjectContext:)

c# - 一个对象怎么能不和null比较呢?

visual-studio - C# 如何使用 IEnumerator 创建通用列表集合

Java 泛型 : what does <? extends Interface <?>> 是什么意思?

java - SonarQube Java路径遍历攻击

java - 使用 tcp/ip 监视器监视 eclipse 上的其余调用

java - spring MVC HTTP状态404

java - 如何在编辑时在 JTable 单元格上方显示文本

java - Java 泛型是否允许在诸如 Short 之类的原语数组中节省内存?