There’s no compilation error because + is a valid (albeit fairly useless) unary operator in the same way that - is:
int x = +1;
int y = -1;
The relevant section in the Java Language Specification is Unary Plus Operator + (§15.15.3 ). It specifies that invoking the unary + operation results in Unary Numeric Promotion (§5.6.1) of the operand. This means that:
If the operand is of compile-time type
Byte,Short,Character, orInteger, it is subjected to unboxing conversion
(§5.1.8).
The result is then promoted to a value of typeintby a widening
primitive conversion
(§5.1.2)
or an identity conversion
(§5.1.1).Otherwise, if the operand is of compile-time type
Long,Float, orDouble, it is subjected to unboxing conversion
(§5.1.8).Otherwise, if the operand is of compile-time type
byte,short, orchar, it is promoted to a value of typeintby a widening
primitive conversion
(§5.1.2).Otherwise, a unary numeric operand remains as is and is not converted.
In any case, value set conversion
(§5.1.13)
is then applied.
In short, this means that
- numeric primitive wrapper types are unboxed, and;
- integer types smaller than
intare widened toint.