gpt4 book ai didi

Java - if-else 和三元运算符之间的不同行为

转载 作者:行者123 更新时间:2023-12-04 10:05:03 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





java conditional operator and different types

(3 个回答)


去年关闭。




最近我发现了 if-else 和三元运算符之间的一个奇怪的行为差异。

我将使用下面的单元测试代码来说明差异。

public class SomeTest {

@Test
void testWithTernary_resultIsLong() {
final SomeClass someClass = new SomeClass();
assertTrue(someClass.getNumberWithTernary() instanceof Long);
assertFalse(someClass.getNumberWithTernary() instanceof Integer);
}

@Test
void testWithIfElse_resultIsInteger() {
final SomeClass someClass = new SomeClass();
assertTrue(someClass.getNumberWithIfElse() instanceof Integer);
assertFalse(someClass.getNumberWithIfElse() instanceof Long);
}

private static class SomeClass {

public Object getNumberWithTernary() {
final long l = this.getLong();
return (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) ? Math.toIntExact(l) : l;
}

private long getLong() {
return 10L;
}

public Object getNumberWithIfElse() {
final long l = this.getLong();
if (l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
return Math.toIntExact(l);
} else {
return l;
}
}
}
}

上面的两个测试都成功了。

上面声明的类与我在工作中遇到的代码相比过于简化了。

主要方法是返回一个 Object ,并且该方法需要尽可能返回一个整数(即在整数范围内),以便在上游使用。

我最初使用的是三元运算的方法,没想到它会意外地起作用,直到进行了冒烟测试。

谁能解释为什么在这种情况下 if-else 和三元运算符的行为不同?

最佳答案

让我们分析一下你的三元表达式 (...) ? Math.toIntExact(l) : l
条件无所谓。第二个操作数(“then”部分)的类型是 int .第三个运算符(“else”部分)的类型是 long .

您可以阅读 Java 语言规范 15.25.条件运算符 ? :为精确的规则。但是基本上所有的数值操作数都被强制转换为“最宽”类型,因为表达式结果必须是单一类型,不能返回“longint”,Java类型系统不够强大(有些语言实际上可以这样做)。

所以基本上编译器将该表达式重写为以下表达式:

(...) ? ((long) Math.toIntExact(l)) : l

并转换 longObject , 编译器插入自动装箱调用:
Long.valueOf((...) ? ((long) Math.toIntExact(l)) : l)

所以这是对您为什么会看到这种行为的粗略解释。

普通 if语句不能返回值,因此它只返回您在 return 中指定的任何内容。声明没有进一步的数字促销。

关于Java - if-else 和三元运算符之间的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61625201/

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