【问题标题】:Call Overloaded methods with ternary operator?用三元运算符调用重载方法?
【发布时间】:2019-03-29 15:07:37
【问题描述】:

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

【问题讨论】:

  • 图片无法访问
  • @TheScientificMethod 我重新贴了图片,现在可以了吗?
  • 我认为更多的是三元运算符的每个返回值必须具有相同的类型。由于? 之后的值是Integer 类型,: 之后的值也必须是Integer,并且您提供的是String。
  • 此代码不会对我产生编译错误。它只会调用load(Object) 方法。
  • @dave 是的,可能是这样,无论如何都可以这样做吗?

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


【解决方案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)时会调用哪个重载方法???

NO!!! load(Object s) 用于 String 和 Object 实例。

【讨论】:

  • 感谢您的解释。但是如果我不需要对象类型方法怎么办。
  • 那么当你使用instanceof时你就有complie time error
  • 其实是的,isntanceof 不是用来选择重载方式的。
【解决方案2】:

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

如果Object object = new String("test"); 在那里。

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

下面是关于 instanceof 如何真正工作的链接: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

【讨论】:

  • 感谢您的回答,但是对于 new String("test") 是一样的吗?我认为编译器在 "" 和 "test" 之间没有区别
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2013-06-29
    • 1970-01-01
    • 2011-10-05
    • 2013-08-27
    • 2012-10-15
    相关资源
    最近更新 更多