Почему я могу присвоить целочисленный литерал переменной короткого типа, но не параметру метода короткого типа?

Почему я могу сделать это:

short a = 5;

Но не это

void setNum(short a);

setNum(5);

Это бросает:

Возможное преобразование с потерями из int в short

Я понимаю, что 5 - это целочисленный литерал, и вы должны разыграть его. Я также понимаю, что если значение не является константой, то очевидно, что оно должно генерировать эту ошибку, потому что, возможно, значение достигает предела короткого типа. Но почему, если компилятор знает, что я передаю константу, которую может содержать короткое замыкание (как в присваивании), он не позволяет его компилировать? Я имею в виду, в чем разница между ними?