2017-08-12 5 views
-1

Java 8のストリームライブラリでは、java.util.stream.Streamの同じメソッドで面白い問題が見つかりました。Java 8のjava.util.stream.Streamのempty()メソッド(型なし)に型パラメータが含まれているのはなぜですか?

  • static <T> Stream<T> empty()

我々は法署名でパラメータがないことを見ることができるように。私の理解によれば、この場合、型パラメータ - <T> - オプション指定子 - staticの後にはありません。たとえば、Optional<T> findAny()のメソッドでは、の型パラメータは予期したとおりに指定されていません。

なぜstatic <T> Stream<T> empty()にタイプパラメータが含まれているのですか?

+3

タイプ推論を参照してください。https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html –

+0

@ holi-javaこれは型推論とは関係がありません。 – Eugene

+0

@Eugene [target types](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html#target_types)セクションで正確に説明しています。私はOPがジェネリックを学び始めていると思うので、まずタイプ推論を見て欲しい。 :) –

答えて

2

てみましょう最初のより良い理由を理解することは、私たち自身の型を宣言:

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>()...我々は効果的RT同等のものを作ってきた、これが理由であることすることができる。これは、まったく同じ効果(およびIMOクリーナー)で、次のように書かれている可能性が

なぜ他のタイプの代わりにempty()の宣言にまだTを使用していたのですか。

今度はfindAnyに同じロジックを適用してみましょう:

public <T> Optional<T> findAny(); 

が、これは警告を生成します - あなたは、クラスレベル(Stream<T>)及び方法の1で宣言され<T>を隠していること。それはfindAnyではなく、既に宣言されている型パラメータを使用しているためです。クラスレベルのフォームとは関係のない別の<T>を導入して隠蔽しています。

関連する問題