首页 > 解决方案 > 当可以证明强制转换是安全的时避免使用@SuppressWarnings("unchecked")

问题描述

强制MyClass<?>转换MyClass<SomeType>通常是不安全的,并且需要使用注释代码@SuppressWarnings("unchecked")以避免相应的编译器警告。然而,在某些情况下,很容易证明演员阵容实际上是完全安全的。考虑一个定义如下的类:

public class MyClass<T> {
    private final Class<T> type;

    public MyClass(Class<T> type) {
        this.type = type;
    }

    public Class<T> getType() {
        return type;
    }
}

假设我有引用Class<SomeType> cMyClass<?> m. 如果c != null && m.getType() == c那么实例m指向的只能被创建为MyClass<SomeType>,即在这种情况下转换mMyClass<SomeType>是完全安全的。实际上,该Class对象充当“类型令牌”,它允许我在运行时检查实例的泛型类型是什么MyClass

问题是是否有一种技术、工具或库允许我以类型安全的方式编写我的代码,而无需抑制警告@SuppressWarnings("unchecked")(对于上面显示的情况以及可能直接证明类型安全的其他情况) ? 更准确地说,我正在寻找满足以下要求的解决方案:

我相当确定使用标准语言功能无法实现这一目标。我认为不可能编写一个单一的通用辅助方法(本身依赖于@SuppressWarnings("unchecked"))来实现与上面显示的具有相似结构的所有类,即我必须为每个这样的类编写一个辅助方法,矛盾第二个要求。

我的假设是该解决方案需要某种形式的代码生成(例如使用注释处理器),它会自动生成执行安全强制转换的必要辅助方法。有这样的东西存在吗?

标签: javagenericstype-safety

解决方案


推荐阅读