Por que posso atribuir um literal inteiro a uma variável do tipo curto, mas não a um parâmetro do método do tipo curto?

Por que posso fazer isso:

short a = 5;

Mas não é isso:

void setNum(short a);

setNum(5);

Lança:

Possível conversão com perdas de int para curto

Eu entendo que 5 é um literal inteiro e você deve convertê-lo. Também entendo que, se o valor não for uma constante, é óbvio que ele precisa gerar esse erro, porque talvez o valor atinja o limite de um tipo curto. Mas por que se o compilador sabe que estou passando uma constante que um short pode conter (como na atribuição), ele não o compila? Quero dizer, qual é a diferença entre eles?

questionAnswers(2)

yourAnswerToTheQuestion