Re: [問題] Wrapping/Widening + Var-args
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
討論串 (同標題文章)