Интересно, что Intellij говорит мне, что тип test
не Object
, а скорее этот зверь:
java.io.Serializable & Comparable<? extends java.io.Serializable & Comparable<?> & constant.Constable & constant.ConstantDesc> & constant.Constable & constant.ConstantDesc
Причина, по которой это так, заключается в том, что компилятор определяет тип переменной как ближайший общий суперкласс между String
и Integer
, которые фактически Serializable
, Comparable
, Constable
и ConstantDesc
в Java 12.
Есть интересная статья, в которой подробно рассматриваются невозможные типы , которые называются этими типами (поскольку они могут быть определены только компилятором): Представление неосуществимого и невозможного с помощью JDK 10 «вар»
Если бы мы возвращали объекты, которые совершенно не связаны, такие как Integer
и ByteArrayOutputStream
, то мы увидели бы, что Java выводит тип времени компиляции test
как Object
:
var test = new Random().nextBoolean() ? 123 : new ByteArrayOutputStream();