【问题标题】:method rules overloading explanation in javajava中的方法规则重载解释
【发布时间】:2014-03-23 16:27:35
【问题描述】:

我尝试了解使用 java 编译器的重载规则。

这对我来说太难了。

public class Main {

    public static void var(Long x) {
        System.out.println("Long");
    }

    public static void var(int... x) {
        System.out.println("int... x");
    }


    public static void main(String... args) {
          var(5);
    }
}

输出:

int...

在互联网上我找到了下一条规则:

  1. 原始扩展 > 拳击 > Varargs。
  2. 不允许加宽和装箱 (WB)。
  3. 允许装箱和加宽 (BW)。
  4. 重载时, Widening + vararg 和 Boxing + vararg 只能以互斥方式使用,即不能一起使用。
  5. 不允许在包装类之间进行扩展

但我无法将此规则应用于此代码行为。

你能帮帮我吗?

我的错误版本:

拳击int -> Integer 并扩大到Long

其他问题

public class Main {

    public static void var(Object x) {
        System.out.println("Object");
    }

    public static void var(int... x) {
        System.out.println("int... x");
    }


    public static void main(String... args) {
          var(5);
    }
}

输出:

object

【问题讨论】:

  • 嗯,答案就在问题中:不允许加宽和装箱 (WB)。要调用采用 Long 的方法,必须将 int 5 扩大为 long,然后将其装箱为 Long。这是不允许的。
  • boxing int -> 整数并扩大到 Long
  • 允许装箱和加宽 (BW)。
  • 不允许在包装类之间扩展。反正规则极其复杂,真相的来源就是JSL。
  • 对我来说对应jls的一部分超级特别复杂

标签: java overloading


【解决方案1】:

int 装箱到Integer 并扩大到Long

虽然intInteger 拳击很好,但IntegerLong 不是有效的加宽。 Long 不是 Integer 的超类型。所以这是无效的。一种选择是加宽,然后是装箱。但是Java中不允许这样的转换。所以剩下的唯一选择就是使用可变参数。

【讨论】:

  • 我注意到另一种奇怪的行为。你能解释一下吗?(添加到主题中)
  • @gstackoverflow 那是装箱​​后加宽。 IntegerObject 是有效的扩展。
  • 装箱+加宽 - 第三步,但可变参数 - 第一步
  • @gstackoverflow 方法重载时记住一件事 -> varargs 排在最后。编译器总是首先尝试精确匹配,然后加宽,然后装箱,然后装箱,然后加宽,然后是可变参数。规则在 JLS 中有。
  • 是否存在vararg +加宽vararg+boxing
猜你喜欢
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
相关资源
最近更新 更多