var test = "Hello World!";
在Java 10+中,以上代码段将进行编译,并且在编译时将test
推断为String
。
但是,我们可以使用条件(三元)运算符返回不同的类型,例如:
var test = new Random().nextBoolean() ? "Hello World!" : 123;
如果我们在运行时打印test.getClass()
,它将输出:
- 类java.lang.String
- java.lang.Integer类
这很有意义,但是在编译时test
的类型是什么?是Object
还是其他?
答案 0 :(得分:3)
有趣的是,Intellij告诉我test
的类型不是Object
,而是这种野兽:
java.io.Serializable & Comparable<? extends java.io.Serializable & Comparable<?> & constant.Constable & constant.ConstantDesc> & constant.Constable & constant.ConstantDesc
之所以如此,是因为编译器将变量的类型推断为String
和Integer
之间的最近通用超类,它们是- Java 12中的事实Serializable
,Comparable
,Constable
和ConstantDesc
。
有一篇有趣的文章详细介绍了不可能的类型,这些类型被称为(因为它们只能由编译器推断):Representing the Impractical and Impossible with JDK 10 “var”
如果我们要返回完全不相关的对象,例如Integer
和ByteArrayOutputStream
,那么我们将看到Java会将test
的编译时类型推断为{ {1}}:
Object