V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anzu
V2EX  ›  Java

为什么会有这种类型转换

  •  
  •   anzu · 2021-01-25 10:15:47 +08:00 · 1733 次点击
    这是一个创建于 1409 天前的主题,其中的信息可能已经有所发展或是发生改变。
        private static Integer getInteger() {
            return null;
        }
    
        public static void main(String[] args) {
            boolean condition = false;
            // error: null pointer exception
            Integer i = condition ? 1 : getInteger();
            if (Objects.equals(i, 1)) {
                System.out.println("i == 1");
            } else {
                System.out.println("i == null");
            }
        }
    
    

    为什么是 getInteger() 返回值退化成 int 而不是 1 提升为 Integer ?

    第 1 条附言  ·  2021-01-25 11:29:40 +08:00

    我懂了!

    找到了相关 specs,下面链接的表格罗列了当 Conditional Operator 遇到不同类型的2号位与3号位时,如何进行类型转换的所有情况,可怕。

    https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25

    对于本例,无论 1 或 Integer 在2号位还是3号位,整个表达式的值类型都将转换成 int,由于表达式结果赋值给 Integer 变量,所以最后还会进行一层隐式转换。

    4 条回复    2021-01-25 20:23:59 +08:00
    mgzu
        1
    mgzu  
       2021-01-25 10:46:13 +08:00
    用 JD-GUI 看到的反编译结果是
    Integer i = Integer.valueOf(condition ? 1 : getInteger().intValue())
    AoEiuV020
        2
    AoEiuV020  
       2021-01-25 11:25:33 +08:00
    还真没注意过这情况,确实有点不友好,出来本来可以避免的空指针,
    不过从一开始我记得的就是 Integer 参与运算会拆箱,int 参与泛型会装箱,
    倒是没有违反我的记忆,
    Bronya
        3
    Bronya  
       2021-01-25 15:35:31 +08:00
    楼主你发的链接里,bnp(..) T | bnp(..) lub(..) 分别是什么意思呀?
    ~~翻译了一下没看太明白🤪~~
    AoEiuV020
        4
    AoEiuV020  
       2021-01-25 20:23:59 +08:00
    啊这,有点宁信度了,代码都跑过了,确实是拆箱,那设计上当然就是拆箱,白皮书当然写着拆箱,不看出知道吧,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3769 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:28 · PVG 18:28 · LAX 02:28 · JFK 05:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.