作者bennylu (减肥)
站内java
标题Re: [问题] Wrapping/Widening + Var-args
时间Wed Sep 8 10:54:58 2010
How about this example
method(5);
..
void method(int... i) {System.out.print("int...");}
void method(long... i) {System.out.print("long...");}
如果没会错意, 那3个步骤只能告诉我哪些method是符合资格的,
但并没有提到当有多个候选人时该如何作选择, 所以也不会提到ambiguous问题,
下面这篇文章和我有一样的问题
http://java.itags.org/java-certification/337/
※ 引述《tkcn (小安)》之铭言:
: ※ 引述《bennylu (减肥)》之铭言:
: : 在设计overloading method时, 如下:
: : method(5);
: : ..
: : void method(long i) {}
: : void method(Integer i) {}
: : void method(int... i) {}
: : 我们知道优先权顺序是widening > wrapping > var-args,
: : 但是如果将上述三者做一些组合,
: : method(5);
: : ..
: : void method(long... i) {}
: : void method(Integer... i) {}
: : 照理说应该是 widening + var-args > wrapping + var-args,
: : 但是compiler抱怨说 reference to "method" is ambiguous,
: : 所以想来问一下各位先进, compiler在挑选overloaded method时详细的演算法,
: : 先谢谢啦
: 这不能算是演算法,只能算是规则吧。
: 根据 Java 1.5 Tiger - A Developer's Notebook
: method resolution is a three-pass process:
: 1. The compiler attempts to locate the correct method
: without any boxing, unboxing, or vararg invocations.
: This will find any method that would have been
: invoked under Java 1.4 rules.
: 2. If the first pass fails, the compiler tries method
: resolution again, this time allowing boxing and
: unboxing conversions.
: Methods with varargs are not considered in this pass.
: 3. If the second pass fails, the compiler tries method
: resolution one last time, allowing boxing and unboxing,
: and also considers vararg methods.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.239.172