おかコンパイル時の場合の動作を利用することにしたのだろうプリミティブ型にはジェネリック医薬品

StackOverflow https://stackoverflow.com/questions/2453359

質問

import java.lang.reflect.Array;

public class PrimitiveArrayGeneric {
    static <T> T[] genericArrayNewInstance(Class<T> componentType) {
        return (T[]) Array.newInstance(componentType, 0);
    }

    public static void main(String args[]) {
        int[] intArray;
        Integer[] integerArray;

        intArray = (int[]) Array.newInstance(int.class, 0);
        // Okay!

        integerArray = genericArrayNewInstance(Integer.class);
        // Okay!

        intArray = genericArrayNewInstance(int.class);
        // Compile time error:
           // cannot convert from Integer[] to int[]

        integerArray = genericArrayNewInstance(int.class);
        // Run time error:
           // ClassCastException: [I cannot be cast to [Ljava.lang.Object;
    }    
}

ようにしているかどうジェネリック医薬品作品Java.いませんか私にとっては3割以上のスニペット:のコンパイラに訴える Integer[] に変換されません int[].の声明を100%真はもちろん、もっ なぜ のコンパイラことである。

まだコメントするラインに従ってコンパイラの"提案"としての第4回、 のコンパイラを実際に満足!!! 現在 コード収集は、イブレア城、イブレア!では、もちろん、かのように、実行時の挙動が int[] に変換されません Object[]T[] 種類-消去に実行時).

このような中、私の質問はなぜそのようなコンパイラ"が"私が割り当て Integer[] 代わりに、3。どのようなコンパイラの理由に到着すること(誤!) レット-イヤリング-ピアス-


あの混乱"と"どちらかと言えば、ここまで作成したも枕の例を説明するために問題はこちら

public class PrimitiveClassGeneric {    
    static <T extends Number> T test(Class<T> c) {
        System.out.println(c.getName() + " extends " + c.getSuperclass());
        return (T) null;
    }
    public static void main(String args[]) {
        test(Integer.class);
        // "java.lang.Integer extends class java.lang.Number"

        test(int.class);
        // "int extends null"
    }
}

だから考えるので絶対にクレイジのコンパイラーで上記のコードは統?

るのではなく、無理があるとの印刷 c.getSuperclass().getName() 上記のコードは、例えば、指定した T extends Number.もちろん現在 getName() をスローします NullPointerExceptionc == int.class, て c.getSuperclass() == null.

とっており、これは非常に良かったことを理由に拒否するのからコードを作成。


その究極の狂気:

    int.class.cast(null);

このコードを編集 運行します。

役に立ちましたか?

解決

の種類 int.classClass<Integer>, ので、 genericArrayNewInstance() いると推定に戻す Integer[].ものの機能を実際に作成し int[], そしてクラスのキャスト例外の場合は返却されます。基本的には、キャスト T[] 内部は機能しない正当なこの場合、 int[] ではない T[] (プリミティブに使用できません。型変数).取り扱いできないプリミティブ配列の型を総称;ですってのメソッドの戻り値の型 Object, たく別の方法を参照型およびプリミティブです。

他のヒント

数ポイント:

  1. プリミティブの autoboxed そのオブジェクトカウンターパート(包装)が必要
  2. プリミティブ配列はオブジェクトでいないautoboxed.
  3. ジェネリックが利用できないプリミティブ型のパラメータ

用例は、こちらが私の前提条件

3つの自動ボックス化が起こるの 型パラメータ, とはありませんが、返される配列
4では、自動ボックス化が起こるの 型パラメータ, がんが発作を起こしたとき メソッド引数, でも、 int[] 発生するもの Integer[] 期待され

自動ボックス化の場合typeパラメータがこれを 自動ボックス化, でもこれと同じである。

更新: 第2の例でも間違っています。 int.classClass, ので、コンパイラがない理由に拒否します。

いはポスター。この狂いにくくなっております。●を利用できませんプリミティブセージ?を求めることはできないコンパイラの問題では言語の問題です。単に間違ったスキッププリミティブ型からクラスを提供します。.

この:

intArray=(int[])配列になります。newInstance(int.class,0);

int.class はクラスオブジェクトです。なのでokに渡します。"int"は、いokなのでこのプリミティブ.ないと言うことで、"ベスト"もしくは言語だけで接着されたものの翻訳であります。

これはいったんを作りラッパーのためのメモリ(配列)の配分のプリミティブを用のクラスを提供します。.を使用する場合は物体が存在しない場合,かなり膨張のための膨大なコレクションは無駄が多いのです。人は、Java言語/機械明らかに少し制限に。ができるようなので間違いの1時間が固定で、となっています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top