Ответ на ваш вопрос (насколько я понимаю) содержится в спецификации языка Java:
https://docs.oracle.com/javase/specs/jls/se11/html/jls-5.html#jls-5.6.2 https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.18.2
Когда вы используете оператор (в этомcase +) для пары операндов (x и y) результирующий числовой тип определяется этими определениями.
Чтобы добавить немного больше деталей, если вы разберете файл класса, сгенерированный вашим кодом, соответствующие инструкции:
0: bipush 10
2: istore_1
3: ldc2_w #2 // double 20.0d
6: dstore_2
7: iload_1
8: i2d
9: dload_2
10: dadd
11: dstore 4
Как вы можете видеть, x сохраняется как int, yхранится как двойнойx помещается в стек, а затем конвертируется в double.После того, как y помещен в стек, можно выполнить dadd (двойное добавление), поскольку оба операнда являются двойными.Компилятор javac генерирует код, который соответствует спецификации языка Java, как описано выше.