==の時の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()

書いてあるのは、

  1. もしpがchar型の値なら、boxing変換はpをr.charValue==pなCharacter型クラス参照rに変換する。
  2. もしrがCharacter型参照なら、unboxing変換はrをr.charValue()に変換する。

ってことだと思うんだけど、1はr = new Character(p)と理解してもいいのか。

もしそうなら、プリミティブ値と参照型の値を==で比べる時は、それぞれの左右のポジション関係なく、常に参照型の方がunboxing変換されて、インスタンス変数.xxxValue()されてるってことだよね。プリミティブ型がboxingされてると常にfalseに成っちゃう。