==の時のAuto-Boxing
char c = 'U'; Character chObj = new Character('U'); // Auto-Boxing System.out.println(chObj==c); // true System.out.println(c==chObj); // true // javac -source 1.4 でコンパイルするとエラー
chObj==c は、CharacterのchObjをunboxing変換でcharにしてから二つを比べていると考えてもいいのかな。もし右のcharをBoxing変換してCharacterインスタンスの参照に変えてから両者を比べていて、それがchObj==new Character(c)しているならfalseなはず。
Java SE Specificationsを見てみた。
5.1.7 Boxing Conversion
If p is a value of type char, then boxing conversion converts p into a reference r of class and type Character, such that r.charValue() == p
5.1.8 Unboxing Conversion
If r is a reference of type Character, then unboxing conversion converts r into r.charValue()
書いてあるのは、
- もしpがchar型の値なら、boxing変換はpをr.charValue==pなCharacter型クラス参照rに変換する。
- もしrがCharacter型参照なら、unboxing変換はrをr.charValue()に変換する。
ってことだと思うんだけど、1はr = new Character(p)と理解してもいいのか。
もしそうなら、プリミティブ値と参照型の値を==で比べる時は、それぞれの左右のポジション関係なく、常に参照型の方がunboxing変換されて、インスタンス変数.xxxValue()されてるってことだよね。プリミティブ型がboxingされてると常にfalseに成っちゃう。