While creating an array, we can pass short
, char
, byte
, int
. So, [why] is int[] a = new int['a']
valid? It doesn't throw a compile time error.
What does an array declaration in this form mean?
While creating an array, we can pass short
, char
, byte
, int
. So, [why] is int[] a = new int['a']
valid? It doesn't throw a compile time error.
What does an array declaration in this form mean?
From JLS Sec 15.10.1:
The type of each dimension expression within a DimExpr must be a type that is convertible (§5.1.8) to an integral type, or a compile-time error occurs.
Each dimension expression undergoes unary numeric promotion (§5.6.1). The promoted type must be int, or a compile-time error occurs.
And from JLS Sec 5.6.1:
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).
and
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).
So, any of Byte
, Short
, Character
, Integer
, byte
, short
, char
or int
are acceptable.
Hence 'a'
, a char literal, is allowed, and is promoted to the int
value 97.
Like most times with this kind of questions, the answer lies in the Java Language Specification:
§ 5.1.2. Widening Primitive Conversion
19 specific conversions on primitive types are called the widening primitive conversions:
byte
toshort
,int
,long
,float
, ordouble
short
toint
,long
,float
, ordouble
char
toint
,long
,float
, ordouble
int
tolong
,float
, ordouble
long
tofloat
ordouble
float
todouble
(Emphasis mine)
It may or may not be intuitive, but a char
is actually an integral type, and the Java rules specify that primitive integral types may be converted to an integral type with a lower or higher-capacity. In this case, it's called a widening primitive conversion.
Andy's answer provides more references to the Java Language Specification, and explicitly states that an expression as in your question is valid.
According to the JLS §15.10.1 Array Creation Expressions,
The type of each dimension expression within a DimExpr must be a type that is convertible (§5.1.8) to an integral type, or a compile-time error occurs.
Each dimension expression undergoes unary numeric promotion (§5.6.1). The promoted type must be int, or a compile-time error occurs.
Here, unary numeric promotion occurs. Here is an excerpt from §5.6.1:
...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).
Therefore, new int['a']
is valid.
If you are wondering how exactly is a char converted to an int, here is the relevant bits from §5.1.2:
A widening conversion of a char to an integral type T zero-extends the representation of the char value to fill the wider format.
Also note that characters are all encoded as integers.
In java char is integer type (hello C++). This code do same int[] a = new int[97];