Java 8 ea-b90 の話ですが、java.util.stream.Stream インターフェースのスーパーインターフェースとして、java.util.stream.BaseStream というインターフェースがあるようです。 java.util.stream の package private なインターフェースなので直接参照することはできませんが、昔は public だったせいか、java.util.stream パッケージの JavaDoc などに名残(というか修正忘れだろうけどw)がちらほらと。 逆アッセンブルとか逆コンパイルとかはあんまりやり方分からないのでリフレクション使ってちまちまクラス宣言やメソッドを解読(?)してみると、大体以下のような感じのインターフェースのようです:
package java.util.stream; import java.util.Iterator; import java.util.Spliterator; interface BaseStream<T, S extends BaseStream<T, S>>{ Iterator<T> iterator(); Spliterator<T> spliterator(); boolean isParallel(); S sequential(); S parallel(); S unordered(); }
どれもデフォルトメソッドではありません。 seqential(), parallel(), unordered() の返り値が S 型になっていて、これはクラス宣言の第2型パラメータによって指定されています。 Stream インターフェースは、この BaseStream を使って以下のように定義されています(メソッド宣言は省略):
package java.util.stream; public interface Stream<T> extends BaseStream<T, Stream<T>>{ ... }
さて、上記の BaseStream, Stream の定義から、Stream の sequential(), parallel(), unordered() の宣言は
Stream<T> sequential(); Stream<T> parallel(); Stream<T> unordered();
となっているべきですが、JavaDoc (Java 8 ea-b90) を見ると返り値が S 型のままになっとる*1。 JavaDoc で package private の型が public な型の宣言に出てくるなんておかしくない?*2 まさか、Java8 からなんらかの新しい文法が導入されたとか?*3
Java言語仕様 第3版 (The Java Series)
- 作者: ジェームズゴスリン,ガイスティール,ビルジョイ,ギッラードブラーハ,James Gosling,Guy Steele,Bill Joy,Gilad Bracha,村上雅章
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2006/12
- メディア: 単行本
- 購入: 1人 クリック: 118回
- この商品を含むブログ (42件) を見る