¿Por qué Java requiere una conversión explícita en una variable final si se copió de una matriz?

Comenzando con el siguiente código ...

byte foo = 1;
byte fooFoo = foo + foo;

Cuando intente compilar este código, obtendré el siguiente error ...

Error: (5, 27) Java: tipos incompatibles: posible conversión con pérdida de int a byte

... pero sifoo es final ...

final byte foo = 1;
final byte fooFoo = foo + foo;

El archivo se compilará correctamente.

Pasando al siguiente código ...

final byte[] fooArray = new byte[1];
fooArray[0] = 1;

final byte foo = fooArray[0];
fooArray[0] = 127;

System.out.println("foo is: " + foo);

... imprimirá

foo is: 1

... lo cual está bien. El valor se copia a una variable final y ya no se puede cambiar. Jugar con el valor en la matriz no cambia el valor defoo (como se esperaba...).

¿Por qué lo siguiente requiere un yeso?

final byte[] fooArray = new byte[1];
fooArray[0] = 1;
final byte foo = fooArray[0];
final byte fooFoo = foo + foo;

¿Cómo es esto diferente al segundo ejemplo en esta pregunta? ¿Por qué el compilador me da el siguiente error?

Error: (5, 27) Java: tipos incompatibles: posible conversión con pérdida de int a byte

¿Cómo puede pasar esto?

Respuestas a la pregunta(3)

Su respuesta a la pregunta