型パラメーターで listFactory を呼び出すことができないのはなぜですか? リストではできるのですか?
インスタンスの作成 クラスのインスタンス作成式では、型がパラメーター化された型である場合、どの型パラメーターもワイルドカードにすることはできません。私は同じように思う:
List<?> list = new ArrayList<?>(); // compile-time error
インスタンス作成の最上位パラメーターのみにワイルドカードを含めることは禁止されています。ネストされたワイルドカードは許可されています。したがって、以下は合法です。
List<List<?>> lists = new ArrayList<List<?>>(); // ok
これが次の理由です。
SClass.<List<?>>listFactory();//ok
Java ジェネリックとコレクションから
ジェネリック メソッド呼び出し ジェネリック メソッド呼び出しに明示的な型パラメーターが含まれる場合、それらの型パラメーターはワイルドカードであってはなりません。
class SClass{
public static <T> ArrayList<T> listFactory(){ return new ArrayList<T>(); }
}
推論される型パラメーターを選択するか、明示的な型パラメーターを渡すことができます。次の両方が合法です。
List<?> list = Lists.factory();
List<?> list = Lists.<Object>factory();
明示的な型パラメーターが渡される場合、ワイルドカードであってはなりません。
List<?> list = Lists.<?>factory(); // compile-time error
ネストされたワイルドカードが許可されています。
List<List<?>> = Lists.<List<?>>factory(); // ok
Java の設計者は、すべてのワイルドカード型が通常の型の短縮形であることを念頭に置いていたため、最終的にはすべてのオブジェクトを通常の型で作成する必要があると考えていました。この制限が必要かどうかは明らかではありませんが、問題になる可能性は低いです。