3

这个问题是基于一个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));

我们观察到,当 this 被执行时,它总是put(String key, Float value)被调用。即使三元运算符解析为整数值也会发生这种情况,因为myCondition不满足。

在我们的例子中,用 a 替换它可以if-else解决问题。我真的要求解释VM何时以及如何选择要执行的方法。

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

4

2 回答 2

3

方法重载在编译时解决,而不是运行时解决。三元表达式的类型是Number——大概有一个put(String key, Number value)方法或一个put(String key, Object value)方法。编辑:我被告知它实际上是被迫浮动的。JLS对此进行了更详细的描述。

其他语言确实会在运行时解决重载问题。这个特性被称为double-dispatch,因为方法是双重分派的,首先是参数类型,然后是 self 类型。

于 2013-07-16T21:00:00.973 回答
0

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

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

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

于 2013-07-16T21:16:12.733 回答