Java Genericsが難しい(5)
ジェネリクスと配列の組み合わせは相性が悪い。
大抵のコードはエラーになる。色々調べたが、そういうものらしい。
それでも納得いかないコードもある。
これもエラーになる。これはあんまりだと思う。
これはコンパイル通っていいんじゃない?
次のバージョンでコンパイル通るよう、直すべきだー。
そんなある日、ClassのAPI見てて気づいたのだけど、
Class#getClasses()の戻り値はClass<?>[]なのよ。
つまり、"ArrayList<string>[] ="の部分は問題ないと。
そこで思いついたのが、effective java second editionの手法や、
Google CollectionsのListsやMapsクラスの手法をちっと拡張した
生成用補助メソッド。
但し、ジェネリクスと配列の組み合わせでどうしてもワーニングが発生する。
そこはあきらめ、少なくとも@SuppressWarnings("unchecked")を書くコードと
書かないコードを切り分ける。
書かざるを得ないなら、コードに散在させず、まとめておく。
で作ったのがこれ。
ジェネリクスとしてもちゃんと機能していて、いいんじゃないか?
@SuppressWarnings("unchecked")は避けるだけでなく、積極的に利用すべき
場合もあるということか。
まあ、あんま気持ちいいもんじゃないけど…。
適宜使っていかないと配列との折り合いが付かないんだもの。
まあ、配列嫌いなのでArrayList<arraylist<Integer>>って書くことの方が
多いと思うけどさ。
(結局それかよ...)
大抵のコードはエラーになる。色々調べたが、そういうものらしい。
それでも納得いかないコードもある。
ArrayList<string>[] = new ArrayList<string>[];
これもエラーになる。これはあんまりだと思う。
これはコンパイル通っていいんじゃない?
次のバージョンでコンパイル通るよう、直すべきだー。
そんなある日、ClassのAPI見てて気づいたのだけど、
Class#getClasses()の戻り値はClass<?>[]なのよ。
つまり、"ArrayList<string>[] ="の部分は問題ないと。
そこで思いついたのが、effective java second editionの手法や、
Google CollectionsのListsやMapsクラスの手法をちっと拡張した
生成用補助メソッド。
但し、ジェネリクスと配列の組み合わせでどうしてもワーニングが発生する。
そこはあきらめ、少なくとも@SuppressWarnings("unchecked")を書くコードと
書かないコードを切り分ける。
書かざるを得ないなら、コードに散在させず、まとめておく。
で作ったのがこれ。
// 定義側
public class ArrayUtils {
;
@SuppressWarnings("unchecked")
private static <T> LinkedList<T>[] newLinkedListArray(int size) {
return new LinkedList[size];
}
;
}
// 利用側
public class Main {
public static void main(String... args) {
ArrayList<Integer>[] temp = ArrayUtils.newArrayLists();
temp[1] = new ArrayList<Integer>();
temp[2] = new ArrayList<Integer>();
// ↓ちゃんとここでエラーになる
temp[3] = new ArrayList<String>();
temp[4] = new ArrayList<Integer>();
}
}
ジェネリクスとしてもちゃんと機能していて、いいんじゃないか?
@SuppressWarnings("unchecked")は避けるだけでなく、積極的に利用すべき
場合もあるということか。
まあ、あんま気持ちいいもんじゃないけど…。
適宜使っていかないと配列との折り合いが付かないんだもの。
まあ、配列嫌いなのでArrayList<arraylist<Integer>>って書くことの方が
多いと思うけどさ。
(結局それかよ...)
コメント