プログラムdeタマゴ

nodamushiの著作物は、文章、画像、プログラムにかかわらず全てUnlicenseです

Generic配列の作り方(追記的なあれ)

前回のは引き値を増やさずに何とか配列を作れないか、とやってみた結果です。
どうしてもジェネリック型の配列を作りたいときはTのClassを渡すことで実装します。

import java.lang.reflect.Array;
public class Generic {
    @SuppressWarnings("unchecked")
    public static <T> T makeTArray(int length,Class<T> tclass){
        return (T
) Array.newInstance(tclass, length);
    }
    
    public static void main(String args) {
        String
str =Generic.<String>makeTArray(2,String.class);
        str[0] = "m9(^Д^)プギャー";
        str[1] = "逝ってよ..._〆(゚▽゚*)";
        System.out.println(str[0]+"\n"+str[1]);
    }
}
 
ただ、ま〜……<String>って書いてあるのにString.classって何か微妙だよね〜。
スタイリッシュじゃないよね。(この発想の結果が前回の記事に繋がります。ま、JAVA言語がそもそもそんなにスタイリッシュじゃないけど……)
 
で、これで何でも作れるのかっていったらそうでもなくって
 
ArrayList<String> str =Generic.<ArrayList<String>>makeTArray(2,???????????????);
 
こんな事は出来ない。引数一つ増やしてまで穴あき。
妥協策として
 
@SuppressWarnings("unchecked")
ArrayList<String>
str =Generic.<ArrayList>makeTArray(2,ArrayList.class);
 
とする事も出来るが、戻ってくる配列要素が必ずしもArrayList<Integer>とか入っていないとは限らないわけで。この場合100%保証できるのは
@SuppressWarnings("unchecked")
ArrayList<Object>[] str =Generic.<ArrayList>makeTArray(2,ArrayList.class);
 
だけですね。
 
そうはいっても、前回と違って目的とするクラス(今回はArrayList)の配列がちゃんと作れるという点では目的は達成しているはずです。ArrayList<String>の<String>って要するにプログラムするときしか関係ないので実際にはArrayList<Integer>もArrayList<String>も同じ物。
 
 
結局の所どうしてもどうしてもどうしても、プログラムする上でも正確なジェネリック型の配列をつくりたい、って時は引き値にその配列を渡すしかないですね。ただ、それの長さが合ってるかどうかはユーザーに任せるしかないのだけど……。