具有不同类型的条件(三元)运算符的局部变量类型推断

时间:2019-05-01 15:01:14

标签: java var type-inference java-10

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还是其他?

1 个答案:

答案 0 :(得分:3)

有趣的是,Intellij告诉我test的类型不是Object,而是这种野兽:

java.io.Serializable & Comparable<? extends java.io.Serializable & Comparable<?> & constant.Constable & constant.ConstantDesc> & constant.Constable & constant.ConstantDesc

之所以如此,是因为编译器将变量的类型推断为StringInteger之间的最近通用超类,它们是- Java 12中的事实SerializableComparableConstableConstantDesc

有一篇有趣的文章详细介绍了不可能的类型,这些类型被称为(因为它们只能由编译器推断):Representing the Impractical and Impossible with JDK 10 “var”

如果我们要返回完全不相关的对象,例如IntegerByteArrayOutputStream,那么我们将看到Java会将test的编译时类型推断为{ {1}}:

Object