It seems reasonable to not allow
int a = 8;
boolean b = (boolean)a;
because that could lead to programmer errors, because the resulting boolean would be false for even integers, but why doesn’t a widening coercion, e.g. int a = true work?
Edit:
According to the JVM specification, Section 3.3.4:
The Java virtual machine encodes boolean array components using 1 to
represent true and 0 to represent false. Where Java programming
language boolean values are mapped by compilers to values of Java
virtual machine type int, the compilers must use the same encoding.
For example:
public static boolean returnFalse() {
return false;
}
public static boolean returnTrue() {
return true;
}
compiles to:
public static boolean returnFalse();
Code:
0: iconst_0
1: ireturn
public static boolean returnTrue();
Code:
0: iconst_1
1: ireturn
The internal representation isn’t relevant.
Java is strongly-typed: an
intisn’t aboolean, and abooleanisn’t anint.This was a design decision–if you want to use true/false, use booleans; that communicates something.
If you want to use an integer to represent true/false, use mathematical comparisons–that’s fine too.
The language doesn’t support direct conversion because it doesn’t, by design.
Regarding the JVM spec and the internal representation of booleans, this sentence is interesting:
To me, that reads:
Clarification on this point would be interesting, but ultimately not related, really.