2

ジェネリックメソッドがある場合

class SClass{
    public static <T> ArrayList<T> listFactory(){ return new ArrayList<T>(); }
}

Tこのメソッドが呼び出されているときに型パラメータを明示的に定義できます。

SClass.<?>listFactory();//compile error
SClass.<List<?>>listFactory();//ok

listFactorytype parameter?では呼び出すことができないのに、 では呼び出すことができるのはList<?>なぜですか?

4

3 に答える 3

5

メソッド呼び出しの規則は、 Java 言語仕様 で説明されています。この場合、私たちが興味を持っているのは

メソッド呼び出し式は、クラスまたはインスタンス メソッドを呼び出すために使用されます。

[...]
TypeName . NonWildTypeArguments Identifier ( ArgumentListopt )

<?>野生型で<List<?>>はありません。

理由としては、

SClass.<?>listFactory();//compile error

<?>で何ができるでしょlistFactory()うか。?は不明です。あなたはできないだろう

new ArrayList<?>(); 

JLSで禁止されているので

クラス インスタンス作成式で使用される型引数のいずれかがワイルドカード型引数である場合、コンパイル時エラーになります (§4.5.1)。

しかし、他のものと一緒に使用することもできませんでした。

于 2013-10-31T20:47:09.313 に答える
1

型パラメーターで 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 の設計者は、すべてのワイルドカード型が通常の型の短縮形であることを念頭に置いていたため、最終的にはすべてのオブジェクトを通常の型で作成する必要があると考えていました。この制限が必要かどうかは明らかではありませんが、問題になる可能性は低いです。

于 2013-10-31T20:44:21.760 に答える