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

Call Overloaded methods with ternary operator?

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

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 实例。

方法解析在编译 时间内完成。在一天结束时,您将一些 return 是一个值的表达式传递给方法。编译器检查表达式的类型并确定它应该调用哪个方法。

在这里,您试图根据 运行时 信息编写一个可能 return 不同类型的表达式,并相应地调用一个方法。正如你所看到的,这不会飞。相反,您可以根据类型显式调用不同的方法(它们具有相同名称的事实无关紧要 - 它们仍然是不同的方法!):

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)
}

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

如果Object object = new String("test");,您的解决方案将有效 有吗

此外,对于像 int、float 等原始类型,您实际上并不需要 instanceof.. instanceof 更适合 类。

这里 link 介绍了 instanceof 的真正工作原理: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html