私はこのようなJava関数を見ました-
public static<T> foo() {...}
私はジェネリックが何であるかを知っていますが、誰かがこの文脈で説明できますか?Tが何に等しいかを誰が決めるのですか?何が起きてる?
編集:誰かが私にこのような関数の例を見せてもらえますか?
私はこのようなJava関数を見ました-
public static<T> foo() {...}
私はジェネリックが何であるかを知っていますが、誰かがこの文脈で説明できますか?Tが何に等しいかを誰が決めるのですか?何が起きてる?
編集:誰かが私にこのような関数の例を見せてもらえますか?
戻り値の型を見逃していますが、それ以外はジェネリック メソッドです。ジェネリック型と同様T
に、任意の参照型 (指定されている場合は範囲内) を表します。
メソッドの場合、ジェネリック パラメーターは通常、コンパイラによって推論されます。特定の状況では、少し特殊な構文を使用して、ジェネリック引数を自分で指定したい場合があります。
List<String> strings = Collections.<String>emptyList();
この場合、コンパイラは型を推測できた可能性がありますが、コンパイラが推測できるかどうかは必ずしも明らかではありません。<>
はドットの後にあることに注意してください。構文上の理由から、型名またはターゲット オブジェクトを常に指定する必要があります。
ジェネリック コンストラクターを使用することは可能ですが、実際に使用されているものを見たことがなく、構文が悪化しています。
C++ と C# の構文では、メソッド/関数名の後にジェネリック型が配置されると思います。
コンテキストは、クラスではなくジェネリック メソッドです。この変数<T>
は、メソッドの呼び出しにのみ適用されます。Collections クラスには、これらが多数あります。クラス自体はジェネリックではありませんが、メソッドの多くはジェネリックです。
コンパイラーは、T が何に等しいかを決定します。それは、型を機能させるものと等しくなります。時々、これは他のものよりも簡単です。
たとえばstatic <T> Set<T> Collections.singleton(T o)
、型がパラメーターで定義されているメソッド:
Collections.singleton(String T)
を返しますSet<String>
。
タイプを定義するのが難しい場合があります。たとえば、入力するのに十分な情報がない場合がありCollection.emptyList()
ます。その場合、タイプを直接指定できます: Collection.<String>emptyList()
.
これは、オブジェクトのインスタンス化で使用される実際の型引数に置き換えられる正式な型パラメーターです。
たとえば、パッケージ java.util の List と Iterator の定義は次のとおりです。
public interface List<E>{
void add(E x);
Iterator<E> iterator();
}
public interface Iterator<E>{
E next();
boolean hasNext();
}
次に、次の方法で List をインスタンス化できます。
List<String> ls = new ArrayList<String>()
List は、E が一様に String に置き換えられたバージョンの List を表していると想像できます。
public interface StringList{
void add(String x)
Iterator<String> iterator();
}