摆脱警告的正确步骤是:
- 首先,证明未经检查的演员表是安全的,并记录原因
- 然后才执行未经检查的强制转换,并
@SuppressWarnings("unchecked")
在变量声明上注释(而不是在整个方法上)
所以是这样的:
// this cast is correct because...
@SuppressWarnings("unchecked")
GenericInterface<String> mockedInterface =
(GenericInterface<String>) EasyMock.createMock(GenericInterface.class);
指导方针
以下摘自Effective Java 2nd Edition:第 24 条:消除未经检查的警告:
- 尽可能消除所有未经检查的警告。
- 如果您无法消除警告,并且您可以证明引发警告的代码是类型安全的,那么(并且只有这样)使用
@SuppressWarning("unchecked")
注释来抑制警告。
- 始终
SuppressWarning
在尽可能小的范围内使用注释。
- 每次使用
@SuppressWarning("unchecked")
注释时,请添加注释说明为什么这样做是安全的。
相关问题
重构演员表
在大多数情况下,也可以在泛型中执行未经检查的强制转换createMock
。它看起来像这样:
static <E> Set<E> newSet(Class<? extends Set> klazz) {
try {
// cast is safe because newly instantiated set is empty
@SuppressWarnings("unchecked")
Set<E> set = (Set<E>) klazz.newInstance();
return set;
} catch (InstantiationException e) {
throw new IllegalArgumentException(e);
} catch (IllegalAccessException e) {
throw new IllegalArgumentException(e);
}
}
然后在其他地方你可以简单地做:
// compiles fine with no unchecked cast warnings!
Set<String> names = newSet(HashSet.class);
Set<Integer> nums = newSet(TreeSet.class);
也可以看看