【问题标题】:Java ternary operator function overloading [duplicate]Java三元运算符函数重载
【发布时间】:2012-10-15 16:05:19
【问题描述】:

可能重复:
Java conditional operator ?: result type
NullPointerException through auto-boxing-behavior of Java ternary operator

假设我有两个功能:

f(MyObject o) { ... }
f(int i) { ... }

我这样称呼他们:

f(someCondition ? 10 : null);

这可以编译,但是当我运行它时,我得到一个空指针异常(抱歉,我不确定在哪种情况下)。我的一些问题是:

  1. 为什么它甚至可以编译? foo ? 10 : null的类型是什么?
  2. 它显然没有调用“正确”函数,因为这不会导致 NPE。那么它调用的是哪个函数呢?是f((MyObject)10); 还是f((int)null)

【问题讨论】:

    标签: java ternary-operator overloading


    【解决方案1】:

    首先,问题与您拥有f 的重载版本这一事实没有任何关系。如果您只有带有intf 版本,您会遇到同样的问题。

    问题是三元表达式的两个可能结果(: 之前和之后)必须具有相同的类型,因为整个表达式 condition ? expr1 : expr2 必须具有单一类型。你不能让这个表达式计算出condition 的一种类型是true,而另一种类型是false

    因此,Java 编译器将查看是否可以将expr1expr2 转换为单一类型。请注意,int 不能是 null(因为它是原始类型)。但是,10 可以通过自动装箱转换为IntegerInteger 也可以是null。所以整个三元表达式的类型被确定为Integer类型。结果是包含值 10Integer 或包含 nullInteger

    第二步是将Integer 传递给f。因为f 需要int,所以它会自动拆箱。

    如果您自动拆箱 Integernull,您会得到一个 NullPointerException - 这就是这里发生的情况。

    【讨论】:

      【解决方案2】:
      1. 类型是Integer - 自动装箱对 10 完成。
      2. f(int) 被调用,因为它是唯一接受的来自 Integer 的可用转换(假设没有其他重载)
        当您尝试将 null 转换为 int 时,您将获得 NPE。

      2. f(Object) 被调用,因为 Integer 是一个对象。这称为引用类型扩展
      (抱歉最初的错误,请阅读为f(Object)

      【讨论】:

        猜你喜欢
        • 2014-09-29
        • 1970-01-01
        • 2014-02-08
        • 2011-03-12
        • 1970-01-01
        • 2015-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多