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 に答える