3

したがって、これは機能します。

int i;
Object a  = (Object) i;
int[] t;
Object b = (Object) t;
String[] s;
Object[] t = (Object[]) s;

しかし、これはしません:

int[] t;
Object[] z = (Object[]) t;

全体として、最初の部分(ボクシング)を取得しますが、2番目の部分が機能しないことは非常に直感的ではありません。(StringがObjectから継承し、intがObjectから継承しない以外に)特定の理由がありますか?

編集:

私の質問を洗練するために、これも機能します:

int a = 2;
int b = 3;
int c = 4;
int d = 2;
Object[] o = new Object[] {a,b,c,d};

しかし、次のことはしません。

int[] t = (int[]) o;

驚いたことに、Stringでも同じ問題が発生します。

String sa = "a";
String sb = "b";
String sc = "c";
String sd = "d";
Object[] so = new Object[] {sa,sb,sc,sd};
String[] st = (String[]) so;

最後の行にクラスキャスト例外を生成します。それでもこれは機能します:

Object[] sy = (Object[])new String[]{sa,sb,sc,sd};
String[] sz = (String[]) sy;
4

6 に答える 6

5

Aint[]プリミティブの配列ですが、オブジェクト自体でもあります。オブジェクトの配列ではありません

アレイの自動ボクシングのサポートはありません。実行時に変換するのではなく、最初に適切なタイプの配列を選択する必要があります。

于 2012-10-31T09:28:38.050 に答える
2

を含むすべての配列int[]は、実際にはObjectです。これが、オブジェクトにキャストできる理由です。ただし、intはプリミティブであるため、拡張Objectされないため、にキャストすることはできませんObject[]

于 2012-10-31T09:28:45.890 に答える
1

あなたが言うように:StringはObjectから継承し、intはObjectから継承しない、それが理由です。int、boolean、double ...はプリミティブ型であり、Objectから拡張されていません。intの代わりにIntegerを使用する必要があります。

Integer[] t;
Object[] z = (Object[]) t;
于 2012-10-31T09:31:21.703 に答える
1

オブジェクトは、クラスインスタンスまたは配列です。

これは、JLSセクション4.3.1に記載されています。

さて、int[]はオブジェクトである配列です。

String[] s; 

int[]

次の点で異なります。

String前者はオブジェクトの配列を指すことができますが、後者はプリミティブの配列を指すことができintます。

于 2012-10-31T09:36:29.350 に答える
0

自分で探していた答えを見つけました。キャストできない理由は、intがプリミティブで拡張さint[]れていないためではなく、それ自体が拡張されていないためです。コード内:Object[]Objectint[]Object[]

int[] t = new int[0];
Object ot = t;
System.out.println(ot instanceof Object[]);
// --> prints 'false'
String[] s = new String[0];
Object os = s;
System.out.println(os instanceof Object[]);
// --> prints 'true'

編集:Eclipseはそれを認識してint[]おりObject[]、互換性がないため、ボクシングが必要です。

編集II:ところで、これif(obj instanceof Object[])により、ボックス化された配列がプリミティブ型の配列であるかどうかを確認できます。

于 2012-10-31T12:25:29.627 に答える
0

Java仕様4.10.3によると、配列型間のサブタイピング:

  • SとTが両方とも参照型である場合、 S> 1 Tの場合、S []> 1T [] 。

  • オブジェクト> 1オブジェクト[]

  • Pがプリミティブ型の場合、Object> 1 P []

S> 1 Tは、TがSの直接のサブタイプであることを意味します

これは基本的に、int[]とInteger[]がJavaの型階層の異なるブランチにあり、相互にキャストできないことを意味します。

于 2017-04-26T12:21:05.193 に答える