3

我正在尝试模拟一个通用接口,每当我模拟它时,我都会收到以下警告:

GenericInterface 类型的表达式需要未经检查的转换以符合 GenericInterface<String>

我的界面是

interface GenericInterface<T>{
    public T get();
}

我的测试是

@Test
public void testGenericMethod(){
    GenericInterface<String> mockedInterface = EasyMock.createMock(GenericInterface.class);
}

我在测试用例的第一行收到警告。

如何删除此通用警告?

4

4 回答 4

11

摆脱警告的正确步骤是:

  • 首先,证明未经检查的演员表是安全的,并记录原因
  • 然后才执行未经检查的强制转换,并@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);

也可以看看

于 2010-07-12T10:54:30.073 回答
2

这里的问题是 EasyMock.createMock() 将返回一个类型的对象GenericInterface而不是GenericInterface<String>. 您可以使用@SupressWarnings注释来忽略警告,或者您可以尝试显式转换为GenericInterface<String>(我认为这只是给出了不同的警告。)

于 2010-07-12T10:42:40.803 回答
0

如果您真的坚持避免编译器警告,您可以在测试中声明一个接口只是为了避免它。

 interface MockGenericInterface extends GenericInterface<String> {}

然后你可以这样做:

 GenericInterface<String> mockedInterface = EasyMock.createMock(MockGenericInterface.class);
于 2010-07-12T19:39:11.910 回答
0

似乎在讨论同样的警告......

我猜@SuppressWarnings 在这种情况下可能是幸福的关键

于 2010-07-12T10:38:58.473 回答