RHE states that for primitive assignment conversion, a primitive(non-boolean) may be converted to another primitive(non-boolean) provided the conversion is a "widening conversion." (p. 103.) RHE goes on to say that
Java's widening conversions are from a byte to a short, an int, a long, a float, or a double.
This makes sense because you avoid accidently squeezing a larger number into a smaller(narrower) data type with a resulting loss of information. (You can always use cast to expressly do this)
Obviously, a float (32 bit) is not wider than a long (64 bit). However, I tried this in code and a long can be converted to a float by assignment. Conversely, RHE says you cannot by assignment convert a float to a long because it would be a "narrowing conversion." Am I missing something? I would appreciate if somebody could tell me why this apparent exception to the rule exists?