S.Klumpers S.Klumpers - 7 months ago 15
Java Question

Java doesn't box and convert primitive types at the same time

I know that java(c?) can box and unbox types and convert between primitive types when necessary, but why does it not want to do that both at the same time.

For example if I were to do this:

ArrayList<Byte> bytes = new ArrayList<>();
bytes.add(8);


Javac will panic and tell me
Collection.add(Byte)
is not applicable, but were I to use
ArrayList<Integer>
instead it would not be a problem.
If I would do
byte aByte = 8; bytes.add(aByte);
it would also compile fine.

Why is this, is there a good reason for this?

Answer

The reason why this happen is because if you do bytes.add(8), 8 is handled as an int. So the following error is thrown:

The method add(Byte) in the type ArrayList < Byte> is not applicable for the arguments (int)

If you want to add 8 directly to your ArrayList you have to cast 8 to a byte

bytes.add((byte)8);

It is not possible to handle 8 as a byte when necessary and in other cases as an int.

Think of the following example:

private static void test() {
  Object o = 8;
}

Now there wouldn't be specified if you want 8 as an byte or an int. So numbers are handled always as ints and no as bytes. So the JVM can box the 8 to the correct wrapper class. o.getClass() is java.lang.Integer in this example.

The same thing is with decimals,e.g. 2.3 is defined as a double if you want 2.3 as an float you have to write 2.3f.

Comments