我正在尝试模拟一个通用接口,每当我模拟它时,我都会收到此警告:
GenericInterface类型的表达式需要未经检查的转换以符合GenericInterface< String>
我的界面是
interface GenericInterface<T>{
public T get();
}
我的测试是
@Test
public void testGenericMethod(){
GenericInterface<String> mockedInterface = EasyMock.createMock(GenericInterface.class);
}
我在测试用例的第一行收到警告。
如何删除此通用警告?
答案 0 :(得分:9)
摆脱警告的正确步骤是:
@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")
注释时,请添加注释,说明为什么这样做是安全的。
SuppressWarnings (“unchecked”)
in Java? 在大多数情况下,也可以在一般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);
答案 1 :(得分:2)
这里的问题是EasyMock.createMock()将返回GenericInterface
而不是GenericInterface<String>
类型的对象。您可以使用@SupressWarnings
注释来忽略警告,或者您可以尝试显式转换为GenericInterface<String>
(我认为这只会给出不同的警告。)
答案 2 :(得分:0)
似乎在讨论相同的警告...
我认为@SuppressWarnings可能是幸福的关键
答案 3 :(得分:0)
如果你真的想避免编译器警告,你可以在测试中声明一个接口,只是为了避免它。
interface MockGenericInterface extends GenericInterface<String> {}
然后你可以这样做:
GenericInterface<String> mockedInterface = EasyMock.createMock(MockGenericInterface.class);