An expression may be assigned to a variable of type byte, short, or char if the expression represents a compile-time constant of type byte, short, char, or int that will "fit" in the variable type. (See JLS 5.2 Assignment Conversion.)
In this example, if the variable 'b' is not final, then it does not represent a compile-time constant, and therefore cannot be assigned to the char variable 'c' without an explicit cast.
"We're kind of on the level of crossword puzzle writers... And no one ever goes to them and gives them an award." ~Joe Strummer sscce.org
If I'd had more time, I would have written a shorter letter. -T.S. Eliot such a short, tiny ad: