Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

Method Overloading และ Ambiguity กับ Varargs ใน Java

ปัญหา 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... vs String[])

Best Practice

  • หลีกเลี่ยง overload varargs หลาย signature
  • ให้มี no-arg version เสมอถ้าอาจถูกเรียกว่าง
  • ใช้ชื่อ method แตกต่างกันหรือ parameter object แทน