Using a "char" when creating a new array: int[] a = new int['a'] [duplicate] Using a "char" when creating a new array: int[] a = new int['a'] [duplicate] arrays arrays

Using a "char" when creating a new array: int[] a = new int['a'] [duplicate]


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 to short, int, long, float, or double
  • short to int, long, float, or double
  • char to int, long, float, or double
  • int to long, float, or double
  • long to float or double
  • float to double

(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 typethat is convertible (§5.1.8) to an integral type, or a compile-timeerror occurs.

Each dimension expression undergoes unary numericpromotion (§5.6.1). The promoted type must be int, or a compile-timeerror 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.