「未知のタイプ」とは
まさにそれが意味すること - にSetはいくつかの一般的なパラメーターがありますが、それが何であるかはわかりません。
したがって、Set<?>変数に割り当てられたセットSet<String>は、 、またはSet<Integer>、または 、Set<Map<Integer, Employee>>または他の特定の型を含むセットである可能性があります。
では、それをどのように使用できるかについて、それはどういう意味ですか?それが何であれ、それから得られるものはすべて のインスタンスになります?。型パラメーターが何であるかがわからないため、セットの要素が割り当て可能になることよりも具体的なことは言えませんObject(すべてのクラスがそれから拡張されているため)。
また、セットに何かを追加することを考えている場合、addメソッドは?(セット内のオブジェクトのタイプであるため、これは理にかなっています) を取ります。しかし、特定のオブジェクトを追加しようとすると、それがタイプ セーフであることをどのように確認できるのでしょうか? できません-文字列を挿入している場合Set<Integer>、たとえば、ジェネリックから取得したタイプセーフを破る可能性があります。したがって、ジェネリック パラメータの型がわからない場合、この型の引数を指定することはできません (null任意の型の「インスタンス」であるため、 の 1 つの例外を除きます)。
ほとんどのジェネリック関連の回答と同様に、コレクションは本能的に理解しやすいため、これはコレクションに焦点を当てています。ただし、引数はジェネリック パラメーターを受け取るすべてのクラスに適用されます。無制限のワイルドカード パラメーターで宣言されている場合、引数?を指定することはできず、受け取るその型の値は にのみ代入できます。Object