java条件运算符和不同类型

Tah*_*idi 4 java conditional-operator

我在ItemClass中有两种方法:

public void setValue(String v);
public void setValue(Double v);
Run Code Online (Sandbox Code Playgroud)

我想使用条件运算符setVAlue在另一个类:

String str = ...
Double dbl = ...
item.setValue((condition) ? str : dbl);
Run Code Online (Sandbox Code Playgroud)

但编译说:

cannot find symbol
symbol  : method setValue(java.lang.Object&java.io.Serializable&java.lang.Comparable<? extends java.lang.Object&java.io.Serializable&java.lang.Comparable<?>>)
Run Code Online (Sandbox Code Playgroud)

我认为编译器使用Double和String 最近的公共超类(超级接口)作为条件运算符的类型.但为什么?

cdh*_*wie 12

因为做任何其他事情都没有任何意义.三元条件运算符必须返回某些特定类型的值- 所有表达式必须在编译时生成特定类型.此外,请注意,重载解析也在编译时发生.您在此处尝试调用的行为(后期绑定)在Java中不存在于此表单中.

表达式的类型必须与truefalse子表达式兼容.在这种情况下,最近的共同祖先类是Object,并且您没有setValue(Object)过载.

这是以工作方式重写所拥有内容的最简单方法:

if (condition) {
    item.setValue(str);
} else {
    item.setValue(dbl);
}
Run Code Online (Sandbox Code Playgroud)

您还可以提供一个setValue(Object)重载,检查传递的对象类型并委托给相应的setValue()重载,如果类型不可接受则抛出异常.