but operator <=, <, > and >= all passed compiling, only == and != fail. what's the reason behind this? it looks to me that == and != don't do unboxing, they just compare two objects directly and fail because type mismatch. while <=, <, > and >= do auto-unboxing and compare the primitive type value. Am I right?
It's all rather messy because 42 == Integer.valueOf(42); does work. The object is unboxed. It all means that you have to pay a greater deal of attention to any code involving these wrapper objects. Instead of compiler options like -source = 1.5 I wish they had done something like they did with assertions: -enable-boxing/-disable-boxing.