Explicit casting is needed if the compiler doesn't know for sure that the assigned value will fit.
char c = 3 compiles
Here the compiler knows that "3" will fit into a char.
and
int a =3; char c =a no.
The compiler is only so smart. It sees a general assignment of int to char, and wants to see a cast.
If you do
final int i = 3;
char c = i;
this compiles fine.
Here, again, the compiler knows for sure that a 3 is assigned, which will fit.