1. ホーム

[解決済み】Javaジェネリックの型パラメータにあるクエスチョンマークは何を意味するのか?[重複しています]。

2022-04-01 06:56:36

質問

これは、Stanford Parserに付属するいくつかの例から引用したコードの小さなスニペットです。 私は4年ほどJavaで開発をしていますが、このスタイルのコードが何を示しているのか、あまり強く理解したことがありません。

List<? extends HasWord> wordList = toke.tokenize();

コードの細かいところは気にしない。 私が混乱しているのは、一般的な表現が英語で一体何を伝えようとしているのか、ということです。

どなたか説明していただけませんか?

どのように解決するのですか?

? extends HasWord

を拡張するクラス/インターフェイスを意味します。 HasWord ." つまり HasWord それ自体、あるいはその子であっても......基本的にはすべて instanceof HasWord プラス null .

もっと専門的に言うと ? extends HasWord の項目31で扱われる境界付きワイルドカードです。 エフェクティブジャバ 第3版 139 ページからです。 第2版の同じ章は オンラインでPDFが利用可能 bounded wildcardsの部分は134ページからのItem 28です。

Update: PDFのリンクはOracleがしばらく前に削除したため、更新しました。 現在は、Queen Mary University of London's School of Electronic Engineering and Computer Scienceがホストしているコピーにリンクしています。

更新2:なぜワイルドカードを使用したいのか、もう少し詳しく説明します。

メソッドを宣言する際、そのシグネチャに List<HasWord> であるならば、あなたが渡すことができる唯一のものは List<HasWord> .

しかし、もしその署名が List<? extends HasWord> を渡すと List<ChildOfHasWord> の代わりに

とは微妙な違いがあることに注意してください。 List<? extends HasWord>List<? super HasWord> . ジョシュア・ブロッホはこう言った。PECS = producer-extends, consumer-super.

この意味は、もしあなたのメソッドがデータを取り出すコレクションを渡すなら(つまり、コレクションがあなたのメソッドが使用する要素を生成する)、次のように使うべきだということです。 extends . もし、あなたのメソッドがデータを追加する (つまり、あなたのメソッドが作成した要素を消費する) コレクションを渡すのであれば、それは super .

これは混乱するように聞こえるかもしれません。 しかし、あなたはそれを List 's sort コマンド(Collections.sortの2引数版へのショートカットに過ぎない)を使用することができます。 を取る代わりに Comparator<T> というように、実際には Comparator<? super T> . この場合、コンパレータは List を使用して、リスト自体を並べ替えています。