- PR -

配列のGenericsについて

1
投稿者投稿内容
くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2006-05-02 00:31
こんにちわ。いつも勉強させてもらています。

またGenericsについての質問です。

書き方@
LinkedList<Integer>[] temp = new LinkedList[10];
という様なコードを書くと警告が出ます。

書き方A
LinkedList<Integer>[] temp = new LinkedList<Integer>[10];
という様なコードを書くとエラーになります。

書き方B
LinkedList[] temp = new LinkedList[10];
にすると警告は出ませんが、その後
temp[0].add(new Integer(0));
とすると警告になります。

書き方Bのtemp[0].add(new Integer(0));が警告になるのは、分かるのですが、
配列のGenericsで、警告を出さないためにはどの様に宣言すればよいのでしょうか
どなたかご教授ください。

ToGo
常連さん
会議室デビュー日: 2002/03/16
投稿数: 46
投稿日時: 2006-05-02 22:31
ジェネリックな型の配列は要注意です。
下記記事に配列とジェネリックの違いについて解説があります。まずはこの記事で
背景を確認すべきかと思います。
http://www-06.ibm.com/jp/developerworks/java/050218/j_j-jtp01255.html

基本はジェネリックな型は配列にはしない、するなら制約を理解して注意深く使う
ということになります。

書き方(1)は原型(raw type)をジェネリックな型に代入しようとしているので、
型安全性を損なう代入になります。コンパイルエラーにしてもよいくらいの式
ですが、Java 1.4までのコードとの互換性上許しているものと考えます。

書き方(3)については、Java 2 SE 5.0以降でジェネリクスを使わないコードを
書いているのにライブラリ側がジェネリクスを使用しているためにコンパイラ
の警告が出るという問題です。これは、型安全性を損なうのとは別問題なので
@SuppressWarnings("unchecked")をメソッドまたはクラスに記述して回避します。

コード:
    @SuppressWarnings("unchecked")
    public static void test1() {
        List temp = new ArrayList();
        temp.add(new Integer(0));
    }


くれよん
ベテラン
会議室デビュー日: 2005/04/28
投稿数: 74
投稿日時: 2006-05-05 09:48
こんにちわ。お返事ありがとうございます。

Genericsは配列にしてはいけないんですね。初めて知りました。
配列のように使用するならListかなにかで、繋げるって感じですかね。

配列も便利なので、気を付けて使うようにします。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)