てみましょう最初のより良い理由を理解することは、私たち自身の型を宣言:
static interface Stream<T> {
public static Stream<T> empty() { // will not compile here
return new Stream<T>() {
};
}
}
このコードは今あるとして、それはIMOは、完全な理にかなって、そのcan not make a static reference to the non-static type T
言って、コンパイルされないでしょう。これは、静的コンテキストが型パラメータとは完全に独立しているためです(これは、最初の質問に答える必要があります)。私たちはメソッドに型パラメータを追加する必要があり、この修正するには
:これはうまくコンパイルされますが、隠された問題がある
public static <T> Stream<T> empty() { // notice the extra <T>
return new Stream<T>() {
};
}
を - クラスT
と方法T
は完全に独立しており、それらの間には関係がありません。あなたがこれを持っているので
public static <R> Stream<R> empty() {
return new Stream<R>() {
};
}
:return new Stream<R>()...
我々は効果的R
とT
同等のものを作ってきた、これが理由であることすることができる。これは、まったく同じ効果(およびIMOクリーナー)で、次のように書かれている可能性が
なぜ他のタイプの代わりにempty()
の宣言にまだT
を使用していたのですか。
今度はfindAny
に同じロジックを適用してみましょう:
public <T> Optional<T> findAny();
が、これは警告を生成します - あなたは、クラスレベル(Stream<T>
)及び方法の1で宣言され<T>
を隠していること。それはfindAny
がではなく、既に宣言されている型パラメータを使用しているためです。クラスレベルのフォームとは関係のない別の<T>
を導入して隠蔽しています。
タイプ推論を参照してください。https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html –
@ holi-javaこれは型推論とは関係がありません。 – Eugene
@Eugene [target types](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html#target_types)セクションで正確に説明しています。私はOPがジェネリックを学び始めていると思うので、まずタイプ推論を見て欲しい。 :) –