VM如何选择正确的执行方法?

时间:2013-07-16 20:54:04

标签: java android

此问题基于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何时以及如何选择要执行的方法。

如果已经回答,请将其标记为重复。提前谢谢!

2 个答案:

答案 0 :(得分:3)

方法重载在编译时解决,而不是在运行时解决。 三元表达式的类型为Number - 可能是put(String key, Number value)方法或put(String key, Object value)方法。编辑:我被告知它实际上是强制的漂浮。 JLS describes this in more detail

其他语言执行解决运行时的重载问题。此功能称为double-dispatch,因为方法是双重调度,首先是参数类型,然后是自我类型。

答案 1 :(得分:0)

好吧,编译器(不是VM)选择第一个方法,值类型为Float,因为表达式的类型

myCondition ? Utils.getFloat(something) : Utils.getInt(something)

是float类型(假设 getFloat 返回 float getInt 返回 int ,如果它们由于表达式的类型为 Number ),因此不会起作用的类型。这是编译器在编译时通过类型提升确定的(例如,整数表达式 getInt 被转换为float类型表达式。)