Quando usamos NÚMEROS LITERAIS (DIGITADOS “NA UNHA”), rrsrs… o compilador consegue ver se o número CABE na variável, ou seja:
byte b = 100; // Ok - 100 é menor que 127, portanto não precisa de Cast,
Só que, se eu fizesse isso:
byte b = 3550; // Não vai compilar, CAST EXPLÍCITO é necessário por que 3550 é maior que 127, portanto o compilador sabe que haverá uma possível perda de precisão e deve te alertar sobre isso.
Quando usamos variáveis, o compilador (em tempo de compilação, claro) NÃO TEM CONDIÇÕES DE SABER O VALOR DA VARIÁVEL, portanto ELE SEMPRE VAI LHE SOLICITAR CAST.
A mesma regra se aplica a todos os outros tipos primitivos.