Скажем, если у нас есть int и на каком-то этапе случается переполнение. Почему бы не сделать, чтобы в этот момент выделить новую память, но уже типа long и переместить значение старой переменной туда.
Если вы говорите о поле класса или даже локальной переменной, то очевидно, что так сделать нельзя.
В приведенном примере случай немного иной — анонимное выражение вычисляется в размерности максимального операнда, а не ячейки, в которую будет записан результат. Видимо, иначе сделать нельзя, потому что именно такое поведение фиксирует JLS. То есть это продумывалось 1) в середине 90-х, 2) с оглядкой на семантику Си.
Хотя поведение и правда вредное и нелогичное.