1

The method getRecommendedIds(String, Object&Comparable<?>&Serializable[]) is ambiguous for the type MyServiceジェネリックスとvarargsを使用するオーバーロードされたメソッドを呼び出そうとすると、コンパイルエラーが発生します。

サービス:

public interface MyService {
    public <K> List<K> getRecommendedIds(String datasource, K... ids);
    public <K> List<K> getRecommendedIds(String datasource, int limit, K... ids);
}

呼び出し:

@Test(expected = NullPointerException.class)
public void testGetWithLimitThrowsNpeForNullDatasource() {
    service.getRecommendedIds(null, 3, UUID.randomUUID());
}

これを回避する方法はありますか?

4

1 に答える 1

3

K変数は制限されていないため、呼び出しは実際にあいまいです。これは、3つの引数のバージョンへの呼び出しであるか(String, K...)、3がオートボックス化されてIntegerKバインドされているバージョンへの呼び出しである可能性がありますObject。あなたがそれを次のように呼ぶなら

service.<UUID>getRecommendedIds(null, 3, UUID.randomUUID());

Kの明示的なバインディングを使用すると、型に割り当てることintInteger割り当てることもできないUUIDため、機能します。したがって、呼び出しは3引数バージョンである必要があります。呼び出しの戻り値を型を制限する変数に割り当てた場合、明示的な境界なしで逃げることもできます。

List<UUID> ids = service.getRecommendedIds(null, 3, UUID.randomUUID());

ここで、コンパイラは、戻り型を一致させるためににバインドKする必要があります。UUID

于 2012-09-05T10:27:09.610 に答える