ปัญหา Ambiguity กับ Varargs
เมื่อ overload method ที่มี varargs (T...) ตัวละแยกชนิดไม่ได้ คอมไพเลอร์จะ confuse
ตัวอย่างที่ Error
public class Demo {
static void myFun(double... vals) {
System.out.println("double...: " + vals.length + " args");
}
static void myFun(boolean... vals) {
System.out.println("boolean...: " + vals.length + " args");
}
public static void main(String[] args) {
myFun(11.56, 34.78); // OK - double
myFun(true, false); // OK - boolean
myFun(); // ERROR: ambiguous!
}
}
Compile Error
Demo.java:15: error: reference to myFun is ambiguous
myFun();
^
both method myFun(double...) in Demo and method myFun(boolean...) in Demo match
1 error
เหตุผล: การเรียก myFun() ไม่มี argument ทั้งสอง method รับได้ (zero arguments) คอมไพเลอร์เลือกไม่ได้
วิธีแก้
1. เพิ่ม Non-varargs Overload
static void myFun() {
System.out.println("no args version");
}
2. ใช้ ชนิดข้อมูลเดียวกัน แยกด้วย parameter ปกติ
static void myFun(double first, double... rest) { ... }
static void myFun(boolean first, boolean... rest) { ... }
// myFun() ยังคง ambiguous ถ้าไม่มี no-arg version
3. รวมเป็น method เดียว ใช้ Object... (ไม่แนะนำ - loss type safety)
static void myFun(Object... args) { ... }
กฎ Varargs Overloading
- Varargs method ถือว่า "น้อยกว่า" fixed-arity method (fixed-arity ชนะ)
- สอง varargs methods ชนิดต่างกัน → ambiguous ถ้าเรียก zero-arg
- Varargs + Array parameter → ambiguous (
String...vsString[])
Best Practice
- หลีกเลี่ยง overload varargs หลาย signature
- ให้มี no-arg version เสมอถ้าอาจถูกเรียกว่าง
- ใช้ชื่อ method แตกต่างกันหรือ parameter object แทน