gpt4 book ai didi

java - 使用不同类型的条件(三元)运算符的局部变量类型推断

转载 作者:行者123 更新时间:2023-11-29 04:09:26 28 4
gpt4 key购买 nike

var test = "Hello World!";

在 Java 10+ 中,上面的代码片段可以编译,test 在编译时被推断为 String

但是,我们可以使用条件(三元)运算符来返回不同的类型,例如:

var test = new Random().nextBoolean() ? "Hello World!" : 123;

如果我们要在运行时打印 test.getClass(),它会输出:

  • class java.lang.String
  • class java.lang.Integer

这是有道理的,但是 test 在编译时的类型是什么?是 Object 还是其他什么?

最佳答案

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

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

之所以会这样,是因为编译器将变量的类型推断为StringInteger 之间最接近 的公共(public)父类(super class)>,它们实际上是 Java 12 中的 SerializableComparableConstableConstantDesc

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

如果我们要返回完全不相关的对象,例如 IntegerByteArrayOutputStream,那么我们会看到 Java 会推断出 的编译时类型>测试成为对象:

var test = new Random().nextBoolean() ? 123 : new ByteArrayOutputStream();

关于java - 使用不同类型的条件(三元)运算符的局部变量类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55938289/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com