java - Java 中转换为泛型类时的类型安全警告

标签 java generics type-safety

我有课

class Property<T> {
    value T;

    public void setValue(T value) {
        this.value = value;
    }
}

现在我有一个列表 List<Property<?>> properties具有各种类型的各种属性。我循环遍历这个列表并想要设置每个属性的值。因此,我需要将通用属性转换为正确的类型,例如: 例如对于整数:

if (property.getType().equals("Integer")) {
        Property<Integer> propInt = (Property<Integer>) property;
        propInt.setValue((Integer) values[i++]);
}

哪里values[]是一个对象数组,其中包含我要设置的值。

一切正常,但 Java 提示类型安全“未检查从 Property<?>Property<Integer> 的转换”。像这样的支票

if (property instanceof Property<Integer>){...}

但这是不可能的。 我如何更改我的代码以消除此警告,或者您知道针对我的情况有更好的做法吗?

最佳答案

编译器提示是因为 property类型为Property<?>可以是或不能是 Property<Integer> 类型一般来说。这是当前 java 语言由于类型删除而固有的限制。

在这种特殊情况下,您要确保 property属于类别Property<Integer>通过使用 getType方法,因此可以安全地忽略警告。

if (property.getType().equals("Integer")) {
        // we have made sure property is of class Property<Integer> so the cast is type safe
        @SuppressWarnings("unchecked")
        Property<Integer> propInt = (Property<Integer>) property;
        propInt.setValue((Integer) values[i++]);
}

用注释来记录它很重要,否则同行评审您的代码可能不会注意到强制转换确实是类型安全的,并且可能会将警告抑制误认为是一种不当行为。

关于java - Java 中转换为泛型类时的类型安全警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31648685/

相关文章:

java - ClientSocket 未监听

java - YAJGCQ 另一个 Java 泛型与集合 Q

java - 如何从泛型类中调用方法作为参数

c#类同时实现和继承

C# 枚举类型安全

java - RandomaccessFile,什么是真正的随机?

java成绩报告家庭作业

java - 如何在二维数组中给定坐标搜索邻居

generics - Grails 类型检查/CompileStatic/GrailsCompileStatic

c++ - 使用枚举进行类型检查——如何正确确定范围