Java Genericsが難しい(5)

ジェネリクスと配列の組み合わせは相性が悪い。
大抵のコードはエラーになる。色々調べたが、そういうものらしい。
それでも納得いかないコードもある。

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>>って書くことの方が
多いと思うけどさ。
(結局それかよ...)
 

コメント

このブログの人気の投稿

日食ツアーその後

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

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