当前位置: 首页 > 面试题库 >

Java条件分配中的类型错误

章晗日
2023-03-14
问题内容

在下面的代码中,我有两个相同的条件赋值操作,一个返回类型为Double的对象,第二个返回字符串“ Integer”。

double d = 24.0;

Number o = (d % 1 == 0) ? new Double(d).intValue() : new Double(d).doubleValue();
String result = (d % 1 == 0) ? "Integer" : "Double";

System.out.println(o.getClass()); // prints "class java.lang.Double"
System.out.println(result); // Integer

为什么完全相同的表达式返回两个不同的东西?


问题答案:

好吧,这是因为条件运算符的JLS规范:

否则,如果第二个和第三个操作数的类型可以转换(第5.1.8节)为数字类型,则有几种情况:

  • 否则,将二进制 数值提升(第
    5.6.2节
    )应用于
    操作数类型,条件表达式的类型是第二和第三操作数的提升类型。

§5.6.2中定义了数字提升。它说:

扩展原语转换(第5.1.2节)适用于转换以下规则指定的一个或两个操作数:

  • 如果一个操作数的类型为double,则另一个将转换为double。




 类似资料:
  • 我有以下具有以下方法的类。 GsonHelper为我提供了一些 在Java 7之前,我一直使用这种方法,例如: 这工作得很好。因为这个方法会返回一个布尔值,我可以在“if”中使用它。但是当我换到Java 8时,这就不可能了。编译器抱怨: 类型不匹配:无法从对象转换为布尔值 我知道java.lang.Boolean可以为空。我可以通过以下方式解决这个问题: 但我很好奇,为什么这在Java 7中有效,

  • 我的函数类似于以下简化代码示例: 当我运行Mypy(版本0.52)我得到这个错误: 错误指向代码示例中的倒数第二行。为什么mypy返回此错误?我的代码是无效的(以任何方式)还是一些mypy错误?

  • 将以下代码转换为typescript时出错。 错误TS2339:属性样式在元素类型上不存在。 当我为如下相同的值分配所需值时 那么误差在元素上,那就是 错误TS2322:类型“Element | null”不可分配给类型“{style:any;}”。类型“null”不可分配给类型“{style:any;}”。

  • 我有一个打字错误: 类型“(element:Conversation)=>void”的参数不可赋给类型“(value:Conversations,index:number,obj:Conversation[])=>boolean”的参数。不能将“void”类型赋给“boolean”类型。 这个错误是什么意思?提前谢谢你。

  • 这段代码给出了一个运行时错误: < li >为什么< code>b.get()不会触发运行时错误? < li >为什么只有当我试图获取class变量的类时才会出现运行时错误? 更准确地说:为什么编译器仅为第二个(导致异常)在字节码中插入指令?

  • 我使用的库定义了以下类型: 库公开了一个返回上述类型的函数: 我想将此函数用于有差别的联合: 但是TypeScript(3.4.1)给了我这个错误信息: 类型“add”不可分配给类型“add” 预期的类型来自属性'type',该属性在这里声明为类型{type:“add”;n:number;} 我不明白为什么会这样-似乎总和(并集)类型被解释为“乘积”类型。 如果将类型定义更改为: ... Type