【问题标题】:How to call overload method in java如何在java中调用重载方法
【发布时间】:2016-01-05 15:45:18
【问题描述】:
public class OverLoad {

    void method(Integer i){
        System.out.println("Integer "+i);
    }
    void method(int i){
        System.out.println("in "+i);
    }
    public static void main(String a[]){
        OverLoad m= new OverLoad();
        m.method(2); //it calls method(int i) why?    
    }
}

如果我调用 m.method(3) 它会调用 int 方法,为什么? 如果我调用m.method((Integer)3),那么它将调用 Integer 方法。

默认情况下它进入原始数据类型

【问题讨论】:

  • 3 是文字原语,因此int 签名是完美匹配。
  • 你能解释一下吗?
  • 如果您传递一个整数,则整数需要自动装箱。所以 int 更接近你传递的参数。当你传递一个 Integer 时,int 方法需要自动拆箱,所以 Integer 更接近你传递的内容。

标签: java


【解决方案1】:

默认情况下它进入原始数据类型

是的,因为那是参数的确切类型。文字 2 的类型是 int,而不是 Integer (JLS 3.10.1)。它可以通过装箱转换 (JLS 5.1.7) 转换为 Integer,但只有在实际需要时才会发生。

根据JLS 15.12.2,Java 中的重载分三个阶段:

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

所以m.method(2)在第一阶段匹配method(int),所以不需要进入第二阶段。

【讨论】:

    【解决方案2】:

    这是因为 2 原始整数 - 不是 Integer 类型的对象。

    只有在找不到完美匹配签名(带 in​​t)时才会发生自动装箱。

    通过使用参数(Integer)3 调用,您可以强制编译器将您的int 3 自动装箱为Integer 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 2010-09-30
      相关资源
      最近更新 更多