18

私は SCJP6 の本 Sierra and Bates の本全体を読み、試験で 88% のスコアを獲得しました。

しかし、ジェネリックの章で説明されていないため、この種のコードがどのように機能するかについては聞いたことがありません。

Collections.<TimeUnit>reverseOrder()

この種のジェネリックの使用法は何ですか? いくつかのコードでそれを発見しましたが、それについて何も読んだことがありません。型推論にいくらかの助けを与えることができるように私には思えます。私はそれについて検索しようとしましたが、見つけるのはそれほど簡単ではありません (そして、SCJP の本/試験にもありません!)

それで、誰かがそれがどのように機能するか、すべてのユースケースなどについて適切に説明できますか?

ありがとう


編集 回答ありがとうございますが、詳細を期待していました:)誰かが追加情報を追加したい場合:

次のようなより複雑なケースはどうですか

  • クラスで宣言された型を使用して、たとえば次のようなことができCollections.<T>reverseOrder()ますか?
  • を使用してextendssuper?
  • 使用する?
  • コンパイラに部分的なヘルプのみを提供する (つまりO.manyTypesMethod<?,MyHelpTypeNotInfered,?,?,?,?,?>())
4

5 に答える 5

18

ジェネリック メソッドの明示的な型指定です。いつでも実行できますが、ほとんどの場合、必要ありません。ただし、コンパイラが独自にジェネリック型を推論できない場合は、これが必要になることがあります。

チュートリアル ページの最後にある例を参照してください。

更新:最初の例のみが有効です。明示的な型引数は、まあ、明示的でなければならないので、ワイルドカードを使用しないextendsか、superそこで許可されます。さらに、各型引数を明示的に指定するか、いずれも指定しないかのいずれかです。つまり、明示的な型引数の数は、呼び出されたメソッドの型パラメーターの数と一致する必要があります。のような型パラメーターTは、現在のスコープで適切に定義されている場合に許可されます (たとえば、囲んでいるクラスの型パラメーターとして)。

于 2012-06-08T08:46:54.247 に答える
3

あなたは 100% 正しいです。それは型推論を助けるためです。ほとんどの場合、Java でこれを行う必要はありません。型を推測できるからです (代入の左側からでも、非常に優れています)。この構文は、Java Web サイトのジェネリック チュートリアルで説明されています。

于 2012-06-08T08:49:19.770 に答える
1

他の回答へのほんの少しの追加です。

対応するコンパイラ エラーが発生した場合:

「伝統的な」キャスティングアプローチでありながら、

(Comparator<TimeUnit>) Collections.reverseOrder()

ジェネリックアプローチに似ています

Collections.<TimeUnit>reverseOrder()

もちろん、キャスト アプローチはタイプ セーフではありません (実行時例外の可能性があります) が、ジェネリック アプローチでは、問題がある場合にコンパイル エラーが発生します。したがって、もちろん、ジェネリックアプローチが優先されます。

于 2012-06-08T09:04:20.463 に答える
1

他の回答が明確になっているように、コンパイラが必要なジェネリック型を把握するのに役立ちます。通常Collections、ジェネリック型の何かを返し、パラメーターを受け取らないユーティリティ メソッドを使用する場合に必要になります。

たとえばCollections.empty*、空のコレクションを返すメソッドを考えてみましょう。を期待するメソッドがある場合Map<String, String>:

public static void foo(Map<String, String> map) { }

直接渡すことはできませんCollections.emptyMap()コンパイラは、それが期待していることを知っていても文句を言いMap<String, String>ます:

// This won't compile.
foo(Collections.emptyMap());

call で必要な型を明示的に宣言する必要がありますが、これはかなり見苦しいと思います。

foo(Collections.<String, String>emptyMap());

または、戻り値を関数に渡す前に変数に代入するemptyMap場合、メソッド呼び出しでその型宣言を省略することができますは、パラメーターのないジェネリック メソッドで型推論を行いますが、そうでない場合もあります。

Map<String, String> map = Collections.emptyMap();
foo(map);

それはあまり重要なことではないように思えるかもしれませんが、ジェネリック型がより複雑になり始めると (たとえばMap<String, List<SomeOtherGenericType<Blah>>>)、ある種類の Java がよりインテリジェントな型推論を行うことを望み始めます (しかし、そうではないので、おそらく新しいものを書き始めるでしょう)。これらすべての醜い<>=Dを避けるためだけに、必要のないクラス。

于 2012-06-08T13:42:37.277 に答える
0

この場合、これは、指定した型に基づいて、オブジェクトにどのような順序付けを適用する必要があるかを reverseOrder メソッドに伝える方法です。コンパレーターは、注文方法に関する特定の情報を取得する必要があります。

于 2012-06-08T08:50:43.440 に答える