2010-12-13 10 views
13

私は5.1.10 Capture ConversionというJLSの講演に気付きましたが、私はそれらが何であるか理解していません。Javaのキャプチャ変換とは何ですか?誰も私に例を教えていただけますか?

誰でも私に説明したり、例を挙げることはできますか?

+0

の撮影したバージョンをチェックされていませんか? –

+0

これは本当ですが、例を示していますが、キャプチャコンバージョンがどのようなものか理解できませんでした。この例を理解しましたか?もしそうなら、彼らが何であるかを親切に私に説明できますか?ありがとう。 –

答えて

18

キャプチャ変換は、ワイルドカード(ジェネリック)を作成するように設計されており、?が便利です。 testが生Testではなく、「後知恵」でrepeatPreviousShout()以来?を返すので、私たちのコードに

public interface Test<T> { 
    public void shout(T whatever); 
    public T repeatPreviousShout(); 

} 

とどこかに私たちが持っている、

public static void instantTest(Test<?> test) { 
    System.out.println(test.repeatPreviousShout()); 
} 

は、我々は以下のクラスがあるとしコンパイラはTestの型パラメータとして機能するTがあることを知っています。 Tは不明のためTのため、コンパイラは未知の型を削除します(ワイルドカードの場合はObjectと置き換えます)。したがって、repeatPreviousShout()Objectを返します。

しかし、私たちが持っていた場合(xxxは例えば、337数である)、

public static void instantTest2(Test<?> test) { 
    test.shout(test.repeatPreviousShout()); 
} 

コンパイラはTest<capture#xxx of ?> cannot be appliedように私たちに何かのエラーを与えるだろう。

コンパイラはshout()上型の安全性の確認を行うにしようとしますが、それは、ワイルドカードを受け取っているので、それはTが何を表すかわからない、したがって、それはのキャプチャーと呼ばれるプレースホルダを作成するためです。 here (Java theory and practice: Going wild with generics, Part 1)から

は、それが明確に述べている:

キャプチャー変換は コンパイラは、 はので、型推論が にそれを推測することができますキャプチャし、ワイルドカードのプレースホルダ 型名を製造、そのタイプにすることができますものです。

希望すると、これが役に立ちます。

+0

追加の例:http://stackoverflow.com/questions/4449611/can-anyone-give-me-an-example-where-the-eclipse-jdt-creates-an-ast-with-a-captur –

+0

@ John、上記の記事(IBMWorksから提供されたリンク)を読んだ場合は、そこから得た例が表示されます。 –

1

ワイルドカード型引数を含むパラメータ化型は、実際には共用体型です。 2例の例

List<? extends Number> = Union{ List<S> | S <: Number } 

ため、代わりList<? extends Number>を使用する、Javaは、Sが上限Numberとだけ作成型の変数である捕捉バージョンList<S>を使用します。

(1)http://java.sun.com/docs/books/jls/third_edition/html/expressions.html

の式の型を狭くします。式の型がList<? extends Number>の場合、オブジェクトの実行時の型が実際にはある具体的な型S(S <: Number>)に対してList<S>であることがわかります。したがって、コンパイラは代わりにList<S>を使用して、より正確な型分析を実行します。

キャプチャ変換は、各式に個別に適用されます。 Aは、ワイルドカードの引数を伴うA :< Bをチェックするサブタイプで

<T> void test1(List<T> a){} 
<T> void test2(List<T> a, List<T> b){} 

List<?> x = ...; 
test1(x); // ok 
test2(x, x); // error 

(2)http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.10.2

:これはいくつかのダムの結果につながります。例えば、実際にはそう

List<? extends Number> :< B 
<=> 
Union{ List<S> | S <: Number} :< B 
<=> 
List<S> :< B, for all S <: Number 

は、我々は議論中以外の例では、直下型のA

関連する問題