2016-10-02 5 views
1

バイト配列が、私はobjを命名したのHashMapのサブクラスのインスタンスでに位置しており、私はその上にこれらのメソッドを呼び出すとき:Java配列はどのようにインデックスからアクセスできませんか?

Class c = obj.get("data").getClass(); 
System.out.println(c.getName() + " is array " + c.isArray()); 

それは何私から

[B is array true 

を印刷します[Bシンボルについて読んだ場合、それはバイト配列であることを意味します。しかし、私はそれがobj.get("data")言うので

System.out.println(obj.get("data").length); 

または

System.out.println(obj.get("data")[0]); 

または

System.out.println(obj.get("data").get(0)); 

または

byte[] ar = (byte[]) obj.get("data"); 

コンパイラは文句を言い、その上にこれらのメソッドを呼び出すしようとすると、 、そのref配列は実際にはObjectだけであり、したがってこれらの利用可能な振る舞いはありません。

インクルードはない、それが配列であることを意味する場合の方法isArray()を正確に何を反映する:ここ

私の基本的な質問はこれでしょうか?

+0

としてマップを宣言することです。 – nachokk

+0

このオブジェクトがObjectのインスタンスであり、そのクラスが 'isArray()'を呼び出した後にtrueを返すので真実ではありません –

+0

Peterでは、javaでは配列がオブジェクトです。 'obj'の定義を表示 – nachokk

答えて

1

これはマップから取得したものは何でもオブジェクトのランタイムクラスを返し

Class c = obj.get("data").getClass(); 

を考えてみましょう。しかし:

System.out.println(obj.get("data").length); 

コンパイラは(宣言)クラスマップのコンパイル時間に基づいて式を検証します。マップの宣言が表示されていないので、返されるコンパイル時の型はget()であると判断できません。私はそれが

Map<String,Object> obj; 

または型パラメータなしで宣言しただけでも、生のマップですと仮定したいのエラーメッセージから

コンパイラは実行時の型を知らないため、不平を言います。

溶液は、オブジェクトがクラスのインスタンスまたは配列であり、例えば

Map<String, byte[]> obj = new HashMap<>(); 
関連する問題