1

私はジェネリックファクトリメソッドを持っています。

public static <T> List<T> create(){
    return new ArrayList<T>();
}

ただし、引数/パラメーターはありません。

関数の型パラメーターは指定しませんが、引数なしで適切な型を認識します。

public static void main(String[] args){
    List<Integer> intlist = create();  //it is an Integer List
    List<String> stringlist = create();  //it is a String List
}
4

2 に答える 2

6

型消去のため、JVM はジェネリック型パラメーターを認識していません。

Javaコンパイラは、宣言した変数の型に関するジェネリック型情報にアクセスできるため、例ではorであるT必要があると推測できます。IntegerString

于 2013-09-05T23:49:06.823 に答える
1

1 つの観点は、ジェネリック パラメーターが明示的に指定されていない場合は、推測されるということです。通常は引数から推測しますが、引数がない場合、変数宣言などの限定的なケースでは左辺から推測できます。

もう 1 つの観点は、ジェネリック パラメーターが明示的に指定されていない場合、コンパイラーはパラメーターが正確に何であるかをあまり気にしないということです。結局のところ、型パラメーターはコンパイルされたバイトコードにはまったく影響しません。それを機能させる何らかの型パラメータが存在することを証明できる必要があるだけです。そして、それはもう気にしません。1 つの状況に対して複数の有効な型パラメーターが存在する可能性があります。しかし、結果に影響を与えないため、どちらが「使用」されるかは問題ではありません。この場合、メソッドは引数を取らず、 がメソッドのジェネリックList<T>であるため、 を受け取るコンテキストで使用されているT限り、List有効List<what exactly>です。TTwhatever type parameter is desired)。したがって、この場合、コンパイラは実際には型パラメーターをまったくチェックする必要はありません。

于 2013-09-06T08:55:37.417 に答える