Concerning primitives: When I cast from smaller to bigger types, the casts are implicit, when I cast from bigger to smaller types, I need to explicitly cast the primitives,
char
is Java's only unsigned type, therefore its value range does not fully contain any other Java type's value range.
You must use an explicit cast operator for any conversion where the target type's range doesn't fully cover the source type's range.
I've taken this from the language specification:
"First, the byte is converted to an int via widening primitive conversion (§5.1.2), and then the resulting int is converted to a char by narrowing primitive conversion (§5.1.3)."