私は5.1.10 Capture ConversionというJLSの講演に気付きましたが、私はそれらが何であるか理解していません。Javaのキャプチャ変換とは何ですか?誰も私に例を教えていただけますか?
誰でも私に説明したり、例を挙げることはできますか?
私は5.1.10 Capture ConversionというJLSの講演に気付きましたが、私はそれらが何であるか理解していません。Javaのキャプチャ変換とは何ですか?誰も私に例を教えていただけますか?
誰でも私に説明したり、例を挙げることはできますか?
キャプチャ変換は、ワイルドカード(ジェネリック)を作成するように設計されており、?
が便利です。 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)から
は、それが明確に述べている:
キャプチャー変換は コンパイラは、 はので、型推論が にそれを推測することができますキャプチャし、ワイルドカードのプレースホルダ 型名を製造、そのタイプにすることができますものです。
希望すると、これが役に立ちます。
追加の例:http://stackoverflow.com/questions/4449611/can-anyone-give-me-an-example-where-the-eclipse-jdt-creates-an-ast-with-a-captur –
@ John、上記の記事(IBMWorksから提供されたリンク)を読んだ場合は、そこから得た例が表示されます。 –
ワイルドカード型引数を含むパラメータ化型は、実際には共用体型です。 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
の撮影したバージョンをチェックされていませんか? –
これは本当ですが、例を示していますが、キャプチャコンバージョンがどのようなものか理解できませんでした。この例を理解しましたか?もしそうなら、彼らが何であるかを親切に私に説明できますか?ありがとう。 –