微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 方法重载和原始类型如何工作?

我在做 Java课程练习.我有这个包含重载方法代码

class A {

    // Overloaded method
    public void f(int n,float x) {
        System.out.println("f(int n,float x) n = " + n + " x = " + x);
    }

    private void f(long q,double y) {
        System.out.println("f(long q,double y) q = " + q + " y = " + y);
    }

    public void f(double y1,double y2) {
        System.out.println("f(double y1,double y2) y1 = " + y1 + " y2 = " + y2);
    }

    public void g() {
        int n = 1;
        long q = 12;
        float x = 1.5f;
        double y = 2.5;
        System.out.println("--- dans g ");
        f(n,q);
        f(q,n);
        f(n,x);
        f(n,y);
    }
}

主要:

public static void main(String[] args){ 
    A a = new A() ;
    a.g() ;
    System.out.println ("--- dans main") ;
    int n=1 ; 
    long q=12 ; 
    float x=1.5f ; 
    double y = 2.5 ;

    a.f(n,q) ; // my problem is here
    a.f(q,n) ; 
    a.f(n,x) ; 
    a.f(n,y) ;  
}

当我在main中调用方法af(n,q)时我期望一个错误,但它调用方法f(int n,float x),而我的q是一个长数字,它的大小比float的大小(8字节)大/ 4字节)所以我想知道这些原始类型是如何工作的?

解决方法

Method invocations占据了相当长的规格.总而言之,编译器如下进行:

>确定可以调用方法的类.
>确定可能被调用的那些类的方法.
>如果确定了多种方法,请选择最具体的方法.

步骤2是这里最有趣的一个:这将在许多步骤中进行.总结一下:

>如果类上的非varargs方法具有完全相同的参数类型(严格调用),请选择该方法.
>如果类上有非varargs方法,其参数类型可以从实际参数中自动转换(松散调用),请选择该方法.
>如果类上的varargs方法具有与自动转换匹配的参数类型,请选择该方法.

您提供的参数与过载的任何参数类型都不完全匹配,因此您需要检查是否可以转换该参数以允许严格调用.严格调用are中的转换:

  • an identity conversion (§5.1.1)
  • a widening primitive conversion (§5.1.2)
  • a widening reference conversion (§5.1.5)

可以通过标识转换将int转换为int. long可以在widening primitive conversion转换为浮点数.

因此f(int,float)是适用的.

f(long,double)和f(double,double)也适用,因为int可以加宽为long和double;长期可以扩大到两倍.

但是,这些特性不如f(int,float),因为int可以加宽为long和double,float可以加宽为double.因此,到informal intuition laid out in JLS Sec 15.12.2.5,这些方法的特异性不如f(int,float).因此,f(int,float)是被调用的那个.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐