java - 汎用パラメータ型を使用した配列の構築

黄舟
リリース: 2017-03-01 11:44:04
オリジナル
1955 人が閲覧しました


少し前にコーディングをしていたときに突然質問が思いつきました。通常、配列はパラメータとしてメソッドに渡されます。メソッド内で配列を作成したい場合はどうすればよいでしょうか。種類が明確であれば、これは難しくありません。渡すパラメータがジェネリック型のパラメータの場合はどうなるでしょうか?

public static <T> T[]  creArray (T obj){
        T[] arr = new T[10];
}
ログイン後にコピー
ログイン後にコピー

T を使用して新しい配列を直接作成する上記の方法は間違っており、コンパイル中にエラーが表示されます: T の汎用配列を作成できません。 Java では、不明な型の配列を直接作成することはサポートされていません。

最終的に、このような完璧な解決策を見つけました:

package Test;import java.lang.reflect.Array;/**
 * 
 * @author QuinnNorris
 * 在泛型方法中创建泛型类型的数组
 */public class Test {
    public static void main(String[] args) {        // TODO Auto-generated method stub

        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でのさまざまな型の配列初期化の値を並べ替えたいだけです:

  1. 基本型(数値型): 0

  2. 基本型(ブール型): false

  3. 基本型(char型): (char) 0

  4. オブジェクト型: null

この前コーディングをしていたら突然問題が発生しました。通常、配列はパラメータとしてメソッドに渡されます。メソッド内で配列を作成したい場合はどうすればよいでしょうか。種類が明確であれば、これは難しくありません。渡すパラメータがジェネリック型のパラメータの場合はどうなるでしょうか?

public static <T> T[]  creArray (T obj){
        T[] arr = new T[10];
}
ログイン後にコピー
ログイン後にコピー

T を使用して新しい配列を直接作成する上記の方法は間違っており、コンパイル中にエラーが表示されます: T の汎用配列を作成できません。 Java では、不明な型の配列を直接作成することはサポートされていません。

最終的に、このような完璧な解決策を見つけました:

package Test;import java.lang.reflect.Array;/**
 * 
 * @author QuinnNorris
 * 在泛型方法中创建泛型类型的数组
 */public class Test {
    public static void main(String[] args) {        // TODO Auto-generated method stub

        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でのさまざまな型の配列初期化の値を並べ替えたいだけです:

  1. 基本型(数値型): 0

  2. 基本型(ブール型): false

  3. 基本型(char型): (char) 0

  4. オブジェクト型: null

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!