2012-05-08 17 views
2

私は自分のJavaコードに次のステートメントを使用していると私はそれが実際にコンパイルされることを確認するために驚いた:誰かがこのジェネリック型のプリミティブ型の使用をJavaで説明することはできますか?

ResponseEntity<byte[]> responseEntity = restTemplate.getForEntity(url.toString(), byte[].class, params); 

ドキュメントからこのメソッドのシグネチャは次のとおりです。

ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> urlVariables) 

私がいましたJavaのジェネリックスでプリミティブを使用することはできないという印象を受けています。もしそうなら、これはどのように機能していますか?これは基本的に統語的な砂糖の下で起こっている何かのための糖ですか?コンパイラがbyte[]Arrayに変換して、何とかそれを使っていると思います。私は誰かが私にこの方法とその理由を説明できるかどうか疑問に思っていました。

答えて

13

配列は実際にはJavaのオブジェクト(参照型)なので、それはObjectの直接のサブタイプです。したがって、ジェネリックスはJavaリファレンスタイプと同様に動作します。

+10

つまり、プリミティブ値の配列はプリミティブ型ではありません – Snicolas

+1

ああ、クール!説明をありがとう - それは理にかなっています。 **編集:**この答えをdownvoteするつもりなら、少なくとも理由を説明する礼儀があります。 –

-5

これは実用的な意味での「ラッパー」です。つまり、プリミティブ型(intまたはbyte)を使用しているにもかかわらず、オブジェクトを作成しています(新しい予約語はオブジェクトをインスタンス化していることを示しています)。

-5

私はあなたがJDK 5以上を使用していると仮定しています。そうであれば、原始バイト[]を内部的にByte []に​​変換するために、Autoboxingが開始されるのは余分です。

+3

私は真実ではないと申します。 –

+6

オートボクシングとは関係ありません。 – Krrose27

+2

これは間違っています、配列はプリミティブではありません(Victor Sorokinによって説明されているように)ので、オートボケが発生しません。 – Uhlen

関連する問題