Arrays.asList()のジェネリクスの仕組み

以前、ジェネリクスについて書いたとき、引数型に(T...)を利用するのは
相性悪いと書いた。
このときは、引数型(T...)を持つ、インタフェースを継承し利用したときを
例にした。

でも、JavaPlatformAPIの中にはArrays.asList(T... t)というメソッドもあった。
そこで、OpenJDKを開いてasList()のソースを調べてみた。

public static <T> List<T> asList(T... a) {
  return new ArrayList<T>(a);
}

あれ?配列受け取る引数のコンストラクタなんてArrayList持ってたっけ?
と思ったらArraysコード内で同名の実装クラスを持ってった。
おおう。
List<T>が戻り値なのでこれを満たせば十分と。
なるほど。

このクラスの中身を見たところ、ジェネリクス配列そのものを内部に持ち、
単純なラッパークラスでした。

ArrayList<T>の様なコンテナとしての利用はOKでComparator<T>みたな
継承前提インタフェースでの引数型に(T...)を利用するのはアウトということか?
ふうむ...


余談ですが、Arrays.asList()の利用方法は、可変長引数からListクラスを
作るだけでなく、配列のラッパークラス生成の便利メソッドとしての
利用もよさそう。
 
 

コメント

このブログの人気の投稿

日食ツアーその後

NashornがOpenJDKのリポジトリに入ってたのでビルドしてみた

Javaのクロージャをいじってみた。(1)