2009-07-07 10 views
5

私は、ジェネリック医薬品が何であるかを知っている誰かが、この文脈で説明することができthis-Java:What is - public static <T> foo(){...}?

public static<T> foo() {...} 

のようなものが見えたJavaの機能を見て?誰がTと等しいかを決定するのは誰ですか?何が起きてる?

EDIT:このような機能の例を教えてください。

+0

public static Collections内のint binarySearch(List <?extends Comparable > list、T key)?これは単なる汎用型です。この場合、キーがStringの場合、ListはStringを比較できるComparableを実装する要素でなければなりません。 Tが何であるかを決めることはありません。時間のチェックをコンパイルするだけです。 – JeeBee

+0

ありがとうございます。 – quilby

答えて

11

あなたは戻り値の型が欠落していますが、それ以外は一般的な方法です。ジェネリック型の場合と同様に、Tは任意の参照型(指定されている場合は範囲​​内)に入ります。

メソッドの場合、汎用パラメータは通常、コンパイラによって推論されます。あなたは少し独特の構文を使用して、一般的な引数を自分で指定したい場合があります特定の状況では:この場合

List<String> strings = Collections.<String>emptyList(); 

、コンパイラは、型を推論している可能性がありますが、コンパイラは缶や缶」かどうかは必ずしも明確ではありませんt。ドットの後には<>があることに注意してください。構文上の理由から、型名またはターゲットオブジェクトは常に指定する必要があります。

一般的なコンストラクタを使用することはできますが、私は野生では見たことがなく、構文が悪化します。

私はC++とC#の構文は、メソッド/関数名の後にジェネリック型を置くと思います。

+0

ああ!私の目!それが燃えます! – skaffman

+0

あなたは揺れます。見て、真のJavaの達人!/bows down /:D – jrharshath

0

Tこれはオブジェクトのインスタンス化で使用される実際のタイプの 引数で置き換えられる正式型パラメータです。

List<String> ls = new ArrayList<String>() 

あなたがそのリストのスタンドを想像するかもしれません:

public interface List<E>{ 
    void add(E x); 
    Iterator<E> iterator(); 
} 

public interface Iterator<E>{ 
    E next(); 
    boolean hasNext(); 
} 

は、その後、あなたがリストをこのようにインスタンス化することができます

は例えば、ここではパッケージjava.utilのリストとイテレータdefinitiosですEが を一様にStringに置き換えたリストのバージョンの場合:

public interface StringList{ 
    void add(String x) 
    Iterator<String> iterator(); 
} 
+0

インスタンス化されるオブジェクトは必ずしもありません。 (例があったはずの合理的な推測を使用してください) –

+0

Hhmm ..あなたは正しいですが、その代わりに_compilation_timeで完了しました(とにかく、後でこのオブジェクトをインスタンス化するために使用されます) –

+0

オブジェクトのインスタンス化はまったく行われません。構文はジェネリック型ではなく、ジェネリック型であるように見えます。 (技術的に質問者の例では、 'foo'という名前のクラスに対して技術的に有効な構文である' public foo(){...} 'となる有効な構文を得るために1つの置換が必要です(あるいはコンパイラは –

2

コンテキストは、クラスではなく汎用メソッドです。変数<T>は、メソッドの呼び出しにのみ適用されます。Collectionsクラスには、これらの数があります。クラスそのものは一般的ではありませんが、メソッドの多くはそうです。

コンパイラは、Tが等しいかどうかを判断します。コンパイラは、どの型を使用するかを決定します。時々これは他のものよりも簡単です。例えば

、型はパラメータで定義されstatic <T> Set<T> Collections.singleton(T o)方法

Collections.singleton(String T) 

Set<String>を返します。

タイプを定義するのが難しい場合もあります。たとえば、Collection.emptyList()と入力するだけの情報がない場合があります。その場合は、タイプを直接指定することができます:Collection.<String>emptyList()

+0

私の編集をご覧ください – quilby

関連する問題