Arrays.asList()のジェネリクスの仕組み
以前、ジェネリクスについて書いたとき、引数型に(T...)を利用するのは
相性悪いと書いた。
このときは、引数型(T...)を持つ、インタフェースを継承し利用したときを
例にした。
でも、JavaPlatformAPIの中にはArrays.asList(T... t)というメソッドもあった。
そこで、OpenJDKを開いてasList()のソースを調べてみた。
あれ?配列受け取る引数のコンストラクタなんてArrayList持ってたっけ?
と思ったらArraysコード内で同名の実装クラスを持ってった。
おおう。
List<T>が戻り値なのでこれを満たせば十分と。
なるほど。
このクラスの中身を見たところ、ジェネリクス配列そのものを内部に持ち、
単純なラッパークラスでした。
ArrayList<T>の様なコンテナとしての利用はOKでComparator<T>みたな
継承前提インタフェースでの引数型に(T...)を利用するのはアウトということか?
ふうむ...
余談ですが、Arrays.asList()の利用方法は、可変長引数からListクラスを
作るだけでなく、配列のラッパークラス生成の便利メソッドとしての
利用もよさそう。
相性悪いと書いた。
このときは、引数型(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クラスを
作るだけでなく、配列のラッパークラス生成の便利メソッドとしての
利用もよさそう。
コメント