English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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
ご読みいただきありがとうございます。皆様のサポートに感謝します!