2013-04-11 2 views
5
public static void main(String[] args) throws Exception { 
    int[] a = new int[] { 1, 2, 3 }; 
    method(a); 
} 

public static void method(Object o) { 
    if (o != null && o.getClass().isArray()) { 
     Object[] a = (Object[]) o; 
     // java.lang.ClassCastException: [I cannot be cast to [Ljava.lang.Object; 
    } 
} 

にオブジェクトをキャストIはmethodにパラメータoの種類だかを知ることになっていませんよ。 Object[]アレイでキャストするにはどうすればよいですか?が配列

instanceofは、パラメータが任意のタイプの配列である可能性があるため、解決策にはなりません。

PS:配列キャストを扱うSOにはいくつかの質問がありますが、配列の型がわからない場所はまだありません。

+0

質問に少し文脈を提供できますか?これらのオブジェクトで何をするつもりですか? –

答えて

6

java.lang.reflect.Array.get()を使用すると、未知の配列から特定の要素を取得できます。

+2

+1と 'Array.getLength()'は長さを取得します。 –

+1

これはリフレクションのために非常に遅く動作します。しかし、アイデアのために+1 – Andremoniy

+1

タグを見ると、私はそれが彼が探しているものだと思う – SGM1

3

それが何であるかのタイプを決定するオプション1

使用o.getClass()getComponentType():。

if (o != null) { 
    Class ofArray = o.getClass().getComponentType(); // returns int 
} 

Demo


オプションを参照してください。 2

if (o instanceof int[]) { 
    int[] a = (int[]) o;   
} 

* Noice:int以外の任意の型を使用して、必要なときにそれがどのような配列であるかを判断できます。

+0

+1 'o!= null'は冗長です –

+0

@PeterLawreyありがとう、それを修正しました。 – CloudyMarble

+0

IMHOこれは最良の答えです。間違って 'Object [] 'をキャストする必要があると思われる質問です。 –

4

実際にはint -sの配列なので、このオブジェクトをObject[]クラスにキャストすることはできません。あなたが書くのであれば、それは正しいようになります。

public static void method(Object o) { 
    if (o instanceof int[]) { 
     int[] a = (int[]) o; 
     // .... 
    } 
} 
+0

これで、プリミティブ型を終了するのと同じくらい多くの 'if'を書きますか? – sp00m

+1

@ sp00m、はい、する必要があります。それは間違ったことではありません。 java.util.Arraysクラスを見ると、これはプリミティブ型の一般的なパターンであることがわかります。たとえば、java.util.ArraysクラスのメソッドhashCodeを参照してください。 – Andremoniy

+1

これ(と他の似たような回答)は私には最適です。 'if'文でメソッドをパックするのは間違っていると感じますが、入力として' Object'を取らなければならないのなら、本当に必要です。 –

5

あなたはObjectの配列にプリミティブの配列(あなたのケースでint複数可)をキャストすることはできません。あなたが変更した場合:

int[] a = new int[] { 1, 2, 3 }; 

Integer[] a = new Integer[] { 1, 2, 3 }; 

にそれが動作するはずです。

+1

プリミティブを渡さないと、常にObjectにキャストでき、問題は解決されます – iberbeu

+0

これはオブジェクトラッパーの配列への不正使用です。そうすれば、メモリにオーバーヘッドが発生します。 – Andremoniy