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
, or Integer
, it is subjected to unboxing conversion
(§5.1.8).
The result is then promoted to a value of type int
by 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
, or Double
, it is subjected to unboxing conversion
(§5.1.8).
Otherwise, if the operand is of compile-time type byte
, short
, or char
, it is promoted to a value of type int
by 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
int
are widened to int
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…