【问题标题】:Boxing+Varargs is preferred over Boxing+WideningBoxing+Varargs 优于 Boxing+Widening
【发布时间】:2012-09-20 10:10:00
【问题描述】:

如果我错了,请纠正我。 Boxing+Varargs 是否优于 Boxing+Widening?

我在site 中发现它是另一种方式。

【问题讨论】:

    标签: java overloading


    【解决方案1】:

    JLS #15.2.2中定义了几个可以符合条件时调用什么方法:

    第一阶段(第 15.12.2.2 节)执行重载决议,不允许装箱或拆箱转换,或使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第二阶段。

    第二阶段(第 15.12.2.3 节)在允许装箱和拆箱的同时执行重载解决方案,但仍排除使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段。

    第三阶段(第 15.12.2.4 节)允许将重载与可变参数方法、装箱和拆箱相结合。

    总而言之:加宽 > 装箱和拆箱 > 可变参数

    【讨论】:

      【解决方案2】:

      Boxing + Widening 优于 Boxing + Varargs。我已经更改了@John 的示例以显示这一点:

      public static void main(String[] args) {
          int i = 2;
          doX(i);
      }
      
      static void doX(Object i) {
          System.out.println("Object");
      }
      
      static void doX(Integer... i) {
          System.out.println("Integer...");
      }
      

      打印

      Object
      

      【讨论】:

      • 您的示例中没有扩展。您的示例表明,拳击比可变参数更受欢迎。
      • @assylias:Integer -> Object 不是根据this part of the specs 考虑加宽吗?
      • 是的,你是对的,出于某种原因,我想到了原始加宽,而不是参考加宽。
      【解决方案3】:

      Boxing+Widening 优于 Boxing+Varargs。一个简单的测试就可以证实这一点。

      public static void main(String[] args) {
          int i = 2;
          doX(2);
      }
      
      static void doX(Object i){
          System.out.println("object...");
      }
      static void doX(Integer... i){
          System.out.println("int...");
      }
      

      打印:

      object...
      

      编辑:对不起,我的错。我已经更正了代码。没注意到我输入了“对象...”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-05-11
        • 1970-01-01
        • 2016-04-17
        • 2013-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多