Это поведение описано в спецификации языка .
Случаи 1 и 3 описываются одной и той же точкой:
Если второй и третий операнды имеют одинаковый тип, то это тип условного выражения.
В случае 1 операнды имеют тип int, поэтому общее выражение имеет тип int, поэтому оно несовместимо. В случае 3 операнды типа byte, следовательно, результат является совместимым.
Случай 2 меня удивляет: я ожидал, что и это тоже не получится, потому что операнд int вызовет условное выражение типа int.
Однако это поведение описано в следующем пункте:
Если один из операндов имеет тип T, где Tis byte, short или char, а другой операнд является константным выражением (§15.28) типа int, значение которого представимо в типе T, тогда тип условного выражения Выражение Т.
20 - это константное выражение, которое помещается в байтах, следовательно, результат является байтом.
Случай 4 также описывается «операндами одного и того же правила типа», используемыми для случаев 1 и 3; однако тот факт, что условие теперь является постоянным, делает его константными выражениями .
Константные выражения типа int неявно сужаются при назначении переменной более узкого типа, как описано в Контексты присваивания :
Может использоваться сужающее примитивное преобразование, если переменная имеет тип byte, short или char, а значение константного выражения представлено в типе переменной.