用三元运算符调用重载方法?

时间:2018-10-25 05:28:51

标签: java methods compiler-errors ternary-operator overloading

使用三元运算符检查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) {
            //
        }
    }
}

sc

3 个答案:

答案 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)对于StringObject实例。

答案 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)

在您的情况下,空字符串或null不会测试引用是否相等。

如果Object object = new String("test");,您的解决方案将起作用 在那儿。

另外,对于诸如int,float之类的原始类型,您实际上并不需要instanceof .. instanceof对于类来说更多。

以下是instanceof实际工作方式的链接: error