使用三元运算符检查instanceOf
不能调用重载方法的规则是什么?
这可能是一个愚蠢的问题,但我希望对此规则不做任何解释。您可以在屏幕快照中看到,我无法使用三元运算符引用多种方法。
public class Sample {
public static void main(String[] args) {
Object object = new String("");
Foo.load(object instanceof Integer ? (Integer) object :
object instanceof String ? (String) object : null);
}
public static class Foo {
public static void load(String s) {
//
}
public static void load(Integer s) {
//
}
}
}
答案 0 :(得分:1)
Object obj = getObject();
if(obj instanceof Integer)
load((Integer)obj);
else if(obj instanceof String)
load((String)obj);
else
load(obj);
错误,因为使用instanceof
时在编译时选择了重载方法,但在运行时选择了不是运行时。要将此检查移至运行时,请使用例如if...else
。
提示
load(obj instanceof String ? (String)obj : obj);
这可以,并且不会引发编译错误,但是您认为,obj = "some string"
,load(String s)
时将调用哪种重载方法?
否! load(Object s)
对于String
和Object
实例。
答案 1 :(得分:1)
方法解析是在编译时间内完成的。在一天结束时,您传递一些将值返回给方法的表达式。编译器检查表达式的类型并确定应调用的方法。
在这里,您尝试编写一个表达式,该表达式可能会根据运行时信息返回不同的类型,并相应地调用一个方法。正如您所看到的,这不会实现。相反,您可以根据类型显式调用不同的方法(它们具有相同的名称是无关紧要的-它们仍然是不同的方法!):
if (object instanceof Integer) {
Foo.load((Integer) object); // Calls Foo.load(Integer)
} else if (object instanceof String) {
Foo.load((String) object); // Calls Foo.load(String)
} else {
Foor.load(object); // Calls Foo.load(Object)
}
答案 2 :(得分:0)