0

次のコード スニペットは、Commons フレームワークの CollectionUtils.java ファイルから取得したものです。

private static class CardinalityHelper<O> {
    final Map<O, Integer> cardinalityA, cardinalityB;

    public CardinalityHelper(final Iterable<? extends O> a,
            final Iterable<? extends O> b) {
        cardinalityA = CollectionUtils.<O> getCardinalityMap(a);
        cardinalityB = CollectionUtils.<O> getCardinalityMap(b);
    }

    public final int max(final Object obj) {
        return Math.max(freqA(obj), freqB(obj));
    }

    public final int min(final Object obj) {
        return Math.min(freqA(obj), freqB(obj));
    }

    public int freqA(final Object obj) {
        return getFreq(obj, cardinalityA);
    }

    public int freqB(final Object obj) {
        return getFreq(obj, cardinalityB);
    }

    private final int getFreq(final Object obj,
            final Map<?, Integer> freqMap) {
        final Integer count = freqMap.get(obj);
        if (count != null) {
            return count.intValue();
        }
        return 0;
    }
}

getCardinalityMap が返さ<O> Map<O, Integer> れる

  1. とはどういうcardinalityA = CollectionUtils.<O> getCardinalityMap(a);意味ですか? これはある種の型キャストですか?
  2. 戻り型とはどういう<O> Map<O, Integer>意味ですか?
  3. このトリックは何と呼ばれますか?

ありがとう

4

1 に答える 1

2

1) cardinalityA = CollectionUtils とは何ですか。getCardinalityMap(a); 意味?これはある種の型キャストですか?

型キャストではありません。ジェネリック メソッドのジェネリック パラメータを明示的に設定することです。<O>宣言からわかるように、CardinalityHelper には汎用パラメーターがあります。

private static class CardinalityHelper<O> {

CardinalityHelper のクライアントがこのクラスを使用するのは、タイプセーフな方法です。

2) 戻り型とはどういう<O> Map<O, Integer>意味ですか?

- ジェネリック パラメータ宣言。 マップ- 戻り型。

3) このトリックは何と呼ばれますか?

Java Generic メソッドを使用しています。

また、標準の JDK ライブラリでも同様の使用法を見つけることができます。例: java.util.Collections.sort(java.util.List)

メタプログラミング原則の Java 実装は非常に限られているため、Java の厳密に型指定された性質によって必要とされる型安全なコンテナーを作成するには、ジェネリック型パラメーターのみを使用できます。

于 2013-01-30T14:06:30.797 に答える