此问题基于Android方案,但一般适用于Java。
在Android中,ContentValues
类有许多put()
方法,包括:
put(String key, Float value)
put(String key, Integer value)
我们的代码有:
contentValues.put(myKey, myCondition ? Utils.getFloat(something) : Utils.getInt(something));
我们观察到,执行此操作时,始终会调用put(String key, Float value)
。即使三元运算符解析为整数值也会发生这种情况,因为myCondition
不满足。
在我们的案例中,用if-else
替换它可以解决问题。我真的要求解释VM何时以及如何选择要执行的方法。
如果已经回答,请将其标记为重复。提前谢谢!
答案 0 :(得分:3)
方法重载在编译时解决,而不是在运行时解决。 三元表达式的类型为编辑:我被告知它实际上是强制的漂浮。 JLS describes this in more detail。Number
- 可能是put(String key, Number value)
方法或put(String key, Object value)
方法。
其他语言执行解决运行时的重载问题。此功能称为double-dispatch,因为方法是双重调度,首先是参数类型,然后是自我类型。
答案 1 :(得分:0)
好吧,编译器(不是VM)选择第一个方法,值类型为Float,因为表达式的类型
myCondition ? Utils.getFloat(something) : Utils.getInt(something)
是float类型(假设 getFloat 返回 float 而 getInt 返回 int ,如果它们由于表达式的类型为 Number ),因此不会起作用的类型。这是编译器在编译时通过类型提升确定的(例如,整数表达式 getInt 被转换为float类型表达式。)