Por que o Java requer uma conversão explícita em uma variável final se ela foi copiada de uma matriz?

Começando com o seguinte código ...

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

Quando tento compilar esse código, recebo o seguinte erro ...

Erro: (5, 27) java: tipos incompatíveis: possível conversão com perdas de int para byte

... mas sefoo é final ...

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

o arquivo será compilado com sucesso.

Passando para o seguinte 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

... o que é bom. O valor é copiado para uma variável final e não pode mais ser alterado. Tocar com o valor na matriz não altera o valor dofoo (como esperado...).

Por que o seguinte requer um elenco?

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

Como isso é diferente do segundo exemplo nesta pergunta? Por que o compilador está me fornecendo o seguinte erro?

Erro: (5, 27) java: tipos incompatíveis: possível conversão com perdas de int para byte

Como isso pode acontecer?

questionAnswers(3)

yourAnswerToTheQuestion