java - 当可以证明强制转换是安全的时避免使用@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> c
和MyClass<?> m
. 如果c != null && m.getType() == c
那么实例m
指向的只能被创建为MyClass<SomeType>
,即在这种情况下转换m
为MyClass<SomeType>
是完全安全的。实际上,该Class
对象充当“类型令牌”,它允许我在运行时检查实例的泛型类型是什么MyClass
。
问题是是否有一种技术、工具或库允许我以类型安全的方式编写我的代码,而无需抑制警告@SuppressWarnings("unchecked")
(对于上面显示的情况以及可能直接证明类型安全的其他情况) ? 更准确地说,我正在寻找满足以下要求的解决方案:
- 它保证了类型安全,即不安全的强制转换会在构建时或在运行时尝试强制转换时导致错误/警告。
- 它不需要我为每个这样的情况编写一个辅助方法。
- 它不能避免从
MyClass<?>
to的转换MyClass<SomeType>
:在某种程度上,可以在MyClass
不执行转换的情况下以类型安全的方式与实例交互(而是使用转换Class
返回的实例getType()
),但这不是一个通用的解决方案。
我相当确定使用标准语言功能无法实现这一目标。我认为不可能编写一个单一的通用辅助方法(本身依赖于@SuppressWarnings("unchecked")
)来实现与上面显示的具有相似结构的所有类,即我必须为每个这样的类编写一个辅助方法,矛盾第二个要求。
我的假设是该解决方案需要某种形式的代码生成(例如使用注释处理器),它会自动生成执行安全强制转换的必要辅助方法。有这样的东西存在吗?
解决方案
推荐阅读
- magento - 如果选择印度货币,则在账单地址的国家/地区列表中仅显示“印度”
- algorithm - 复杂度最好的寻路算法是什么?
- java - java.lang.IllegalArgumentException:这个源已经添加了不同的观察者
- java - 具有自己的数据库用户详细信息的云端点的自定义身份验证
- javascript - 媒体内容的不同路径
- mysql - 按条件用其他列值更新 Sql 列
- javascript - 即使从应用程序切换后,如何确保我添加到列表中的内容仍然存在
- node.js - 使用 Typescript 向 expressjs 中的 req 对象添加属性
- python - numpy linalg.solve,不是方阵
- micronaut - Micronaut 为 MySQL 配置 micronaut-jdbc-tomcat 数据源