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方法具有完全相同的参数类型(严格调用),请选择该方法. 您提供的参数与过载的任何参数类型都不完全匹配,因此您需要检查是否可以转换该参数以允许严格调用.严格调用are中的转换:
可以通过标识转换将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)是被调用的那个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |