7

2 つのリストを処理するための次のような単純なメソッドがあるとします。

public static <B> void foo(List<B> list1, List<B> list2) {
}

そして、次のように呼び出したいとします。

foo(ImmutableList.of(), ImmutableList.of(1));

javacこれは、整数の 2 つのリストを作成しようとしていたことを理解するほどスマートではないため、コンパイルされません。代わりに、次のように書く必要があります。

foo(ImmutableList.<Integer>of(), ImmutableList.of(1));

foo最初のバージョンが 2 番目のバージョンと同様に機能するようにするには、 の宣言をどのように変更すればよいですか?

4

3 に答える 3

3

Java の型推論は、統合を処理できるほど強力ではないと確信しています。

あなたができることは、ある種の中間オブジェクトを返し、呼び出しサイトを次のように変更することです:

foo(list1).and(list2)

ただし、それでも左から右にしか推論できないため、次のように呼び出す必要があります。

foo(ImmutableList.of(1)).and(ImmutableList.of());
于 2012-04-19T04:08:22.217 に答える
2

これがあなたにとって不便であると私が予見する唯一の設定は、あなたがこれを頻繁に行うときです. その場合、あなたは

private static final ImmutableList<Integer> EMPTYINTLIST = ImmutableList.<Integer>of();

EMPTYINTLISTあなたの電話であなたを使用してください。

于 2012-04-19T04:34:03.530 に答える
1

パラメータの一般的な情報を変更するだけでそれを行うことができ、両方のバージョンが機能します。

  public static <B> void foo(List<? super B> list1, List<B> list2) {


        }

これで両方のバージョンが動作します。

foo(ImmutableList.of(), ImmutableList.of(1));
foo(ImmutableList.<Integer>of(), ImmutableList.of(1));
于 2012-04-19T04:24:21.580 に答える