2011-12-15 22 views
5

これに遭遇したときに問題に取り組んでいました。int型のcharへのcharがchar型ではなくJavaのInteger型になる理由

(int)input.charAt(i) //works 
(Integer)input.charAt(i) // Does not work 
// input being a string 

私が持っている最初の考えは、プリミティブが異なって扱われるため、これが機能しない理由です。しかし、最初にInteger Wrapperクラスを持つ理由を理解することは難しいです。

編集: ラッパークラスを使用する利点は何ですか?プリミティブが存在せず、設計上のより多くのオブジェクト指向になっているだけのためですか?私はそれがどのように役立つのか理解するのが難しいと思っています。新しい疑問

+2

興味深い。私はそれが自動ボックスになる可能性があると思ったでしょう。 – DerMike

答えて

7

プリミティブの扱いが異なっています。以下は動作します:

(Integer)(int)input.charAt(i); 

違いは、引数がint(Integer)ボックスが整数であるとき。それはそれがそれのように見えても、実際にキャストではありません。しかし、引数がcharであれば、キャストしようとします。プリミティブはオブジェクトにキャストできないため、機能しません。あなたがにできるのはです。最初にcharintにキャストしてください - このキャストは両方ともプリミティブタイプなので大丈夫です - そしてintはボックス化できます。

もちろん、char - >Integerボクシングが有効になっています。 "何故なの?"良い質問です。おそらく、特に同じ機能が少し明示されることによって達成される場合、このような機能の使用はほとんどないでしょう。 (char必要があります - そして、あまりにも>Long仕事、そしてchar - >Short文字が16ビットなので、これが最も簡単でしょう?。)編集する

回答:ラッパークラスの利点は、ラップというプリミティブであります例えば、List<Integer>に格納されたオブジェクトのように扱うことができます。 intはオブジェクトではないため、List<int>は機能しません。だから、さらに関連性の高い質問があります、OO言語でやっている原始的な非オブジェクトは何ですか?答えはパフォーマンスです。プリミティブは高速で、メモリは少なくて済みます。ユースケースは、オブジェクトの利便性やプリミティブのパフォーマンスがより重要かどうかを決定します。

+0

コレクションのプリミティブを使用しないと、パフォーマンスが向上しますか? – gizgok

+0

@gizgok:プリミティブはオブジェクトではないので、コレクションにプリミティブを使用する方法はありません。つまり、 'List 'を構築することはできません。コンパイルされません。プリミティブ配列*はオブジェクトなので、 'List 'はうまくいくでしょうし、あなたが何をして、どのようにすれば 'List 'と少なくとも同等以上のパフォーマンスが得られます。 –

2

整数はObjectです。 charはそうではありません。 Object以外のものをObjectにキャストすることはできません。

実際には、あるオブジェクトをそのオブジェクトの階層にない他のどのクラスのオブジェクトにもキャストできません。あなたはsStringの目的であるこの

Integer g = (Integer) s; 

を行うことはできません

など。

ここで、chatがintに作用する理由は、すべての文字がjavaでユニコードとして表現されるため、バックエンドでcharと見なすことができるからです。charはintのより小さなバージョンです。 (intは32ビット、charは16ビット)

+0

本当ですが、私はオートボクシングが起こっただろうと思った。 – gizgok

+0

オートボクシングはintに対してのみtrueです。これは、intをIntegerに変換するときに明示的にキャストする必要がないことを意味します。 @gizgok – Zohaib

関連する問題