English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

java 泛型パラメータの型を構造する方法と例の詳細

java 泛型パラメータの型を構造する方法と例の詳細

前書き:

最近コードを書いている時に突然問題が浮かびました。通常私たちの配列はメソッドに引数として渡されますが、メソッド内で配列を作成したい場合はどうでしょうか?タイプが明確な場合、これは特に難しいことではありません。もし引数が汎型のタイプの引数であればどうでしょうか?

public static <T> T[] creArray (T obj){
    T[] arr = new T[10];
}

上記のようにTを使って直接new配列を使用するのは間違っています。コンパイル時に「Cannot create a generic array of T.」というエラーが発生します。Javaでは未知のタイプで直接配列を作成することはサポートされていません。

最後に私はこの完璧な解決策を手に入れました:

package Test;
import java.lang.reflect.Array;
/**
 * 
 * @author QuinnNorris
 * 汎型メソッド内で汎型タイプの配列を作成します
 */
public class Test {}}
  public static void main(String[] args) {
    // TODO 自動-自動生成されたメソッドスケルトン
    String a = "ccc";//String、ジェネリックタイプとして作成
    String[] ar = creArray(a);
    for(String art : ar)//ループで印刷
      System.out.println(art);
  }
  //ジェネリックスタティックメソッド
  public static <T> T[] creArray (T obj){
    T[] arr = (T[])Array.newInstance(obj.getClass(), 5);
    arr[1] = obj;
    System.out.println(arr[1);
    return arr;
  }
}

コードの输出は以下の通りです:

ccc //メソッド内でarr[1] 
null //以下5これはmainメソッド内のループで反復される配列の値です 
ccc 
null 
null 
null

上記の方法は完全に実行可能です。ArrayクラスのnewInstanceメソッドを使用して、指定されたタイプの配列を構築しました。この作業を反射を使用して行うことも理にかなっています。なぜなら、泛型タイプTは実行時にのみ決定されるため、泛型配列を作成するには、Javaの実行時に何らかの方法で行う必要があります。Javaの実行時に機能する技術は反射しかありません。

nullを見つけたら、ここでもjavaの異なるタイプの配列の初期化値の状況を整理してみます:

基本タイプ(数値型):0
基本タイプ(ブール型):false
基本タイプ(char型):(char)0
オブジェクトタイプ:null

ご読みいただきありがとうございます。皆様のサポートに感謝します!

おすすめ