นัท
: ถ้า overloaded methods หลายๆ
ตัวมี parameters จำนวนเท่ากัน แต่ประเภทต่างกันบ้าง
เวลาเราเรียกใช้แบบส่ง arguments ต่างๆ
ซึ่งมีประเภทไม่ตรงกับ parameters ของเมท็อดเหล่านี้แบบเป๊ะๆ
แล้วเขาจะเลือก methods ไหนให้ ? ได้ลองดูบ้างบางกรณีที่แปลผ่าน บางกรณีก็ฟ้องว่ากำกวม อยากรู้กฎการเลือกเมท็อดที่แน่นอน 1: public class A { แบบนี้แปลผ่าน และเลือกเมท็อดแรก 1: public class A { แบบบนนี้แปลไม่ผ่าน บ่นว่ากำกวม พ่อ : เปิดดู Java Language Specification หัวข้อ 15.12.2.2 พบว่ามีใจความท่อนหนึ่งเขียนไว้อย่างนี้
การพิจารณาว่าใคร specific กว่าใครหรือไม่ กระทำดังนี้
ตัวอย่างที่ 1 void g(int x, int y, byte z) {} void g(int x, long y, int z) {} void g(long x, int y, long z) {} ถ้าต้องการเรียก g(1,1,1) จะตัด method แรกออกจากการพิจารณา เพราะรับ byte
ที่เหลือสองเมท็อด พบว่าเราไม่สามารถนำ parameters ของ method
ที่สองส่งให้ method ที่สาม (ติดตัวกลาง long y ส่งให้ int y
ไม่ได้) ตัวอย่างที่ 2 void g(int x, long y, int z) {} void g(int x, double y, int z) {} ถ้าต้องการเรียก g(1,1,1) พบว่า method ทั้งสองรับได้ พิจารณาทั้งสอง methods นี้ จะพบว่าเราสามารถนำ parameters ของ method แรก ส่งให้ method หลังได้หมด (ตัวแรกและตัวหลังเหมือนกัน ส่วนตัวกลาง long y ส่งให้ double y ได้) แบบนี้การเรียกใช้ g(1,1,1) จะ compile ผ่าน และเลือก method แรก เพราะ specific กว่า นัท : ขอกลับไปทดลองดูค่ะ Copyright 2003 Somchai Prasitjutrakul |