java - 为什么我会收到此泛型类型的未经检查的转换警告?

标签 java generics types casting warnings

这是我的代码:

public class SetWritable<T extends Writable> implements Writable {      
    private Class<? extends Writable> valueClass;
    private Set<T> values;  

    public SetWritable(Class<T> valueClass) {
        this.valueClass = valueClass;
        this.values = new HashSet<T>();
    }

        public void readFields(DataInput in) throws IOException {
        values = new HashSet<T>();          
        int len = in.readInt();

        for (int i = 0; i < len; i++) {         
            //this line is where I get the warning
            //FYI, WritableFactories.newInstance returns an instance of Writable
            T value = (T) WritableFactories.newInstance(valueClass);

            value.readFields(in);               
            values.add(value);
        }
    }
}

让我感到困惑的是:我已经断言 T 扩展了 Writable,那么当我尝试将 Writable 转换为 T 时为什么会收到警告?既然我知道 T 扩展了 Writable,那么抑制这个警告是否安全?

最佳答案

您收到警告是因为 WritableFactories.newInstance返回 Writable和你的 T 扩展 Writable ,所以它可能不是一个安全的转换。但是,由于您使用的是 Class<T>作为你对 newInstance 的论证禁止显示此警告是安全的。

存储valueClass可能会更好作为Class<T>并使用 Class#cast 给你投,那你就不丑了@SuppressWarnings卡在你的方法上。

关于java - 为什么我会收到此泛型类型的未经检查的转换警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10019974/

相关文章:

java - org.openqa.selenium.NoSuchElementException : no such element: Unable to locate element error using Selenium through Java

java - 在一组 4 个数字中查找出现次数最多的数字的最有效算法

java - Android - 从线程中返回 boolean 值

c# - 如何在不知道 T 范围的情况下传递 Func<T>?

c - 类似于 C++ 泛型的 C 函数

java - 在 Java 中,方法签名 Enumeration<? extends ZipEntry> 是什么意思?

scala - Scala中的参数化数据类型

java - 签名的小程序在 IE8/Window 7 中不起作用

c - 如何在 C 中将一种类型的变量更改为另一种类型的变量?

TypeScript 无法在函数类型中派生类型约束