Java จะพยายามใช้เมธอดเวอร์ชันที่เฉพาะเจาะจงที่สุดที่มีอยู่เสมอ (ดูJLS §15.12.2 )
Object
, char[]
และInteger
ทุกคนสามารถใช้null
เป็นค่าที่ถูกต้อง ดังนั้นทั้ง 3 เวอร์ชันจึงใช้ได้ดังนั้น Java จะต้องหาเวอร์ชันที่เจาะจงที่สุด
เนื่องจากObject
เป็น super-type char[]
เวอร์ชันอาร์เรย์จึงมีความเฉพาะเจาะจงมากกว่าObject
-version ดังนั้นหากมีเพียงสองวิธีนี้ระบบchar[]
จะเลือกเวอร์ชัน
เมื่อทั้งสองchar[]
และInteger
รุ่นที่มีอยู่แล้วทั้งสองของพวกเขาเป็นที่เฉพาะเจาะจงมากขึ้นกว่าObject
แต่ไม่มีผู้ใดเป็นเฉพาะเจาะจงมากขึ้นกว่าที่อื่น ๆ ดังนั้น Java ไม่สามารถตัดสินใจที่หนึ่งที่จะโทร ในกรณีนี้คุณจะต้องระบุอย่างชัดเจนว่าคุณต้องการเรียกใช้อาร์กิวเมนต์ใดโดยการส่งอาร์กิวเมนต์เป็นประเภทที่เหมาะสม
โปรดทราบว่าในทางปฏิบัติปัญหานี้เกิดขึ้นไม่บ่อยนัก เหตุผลนี้จะเกิดขึ้นเฉพาะเมื่อคุณกำลังเรียกใช้เมธอดอย่างชัดเจนโดยมีnull
หรือด้วยตัวแปรประเภทที่ค่อนข้างไม่เจาะจง (เช่นObject
)
ในทางตรงกันข้ามการเรียกร้องต่อไปนี้จะไม่คลุมเครืออย่างสมบูรณ์แบบ:
char[] x = null;
doSomething(x);
แม้ว่าคุณจะยังคงส่งผ่านค่าอยู่null
แต่ Java ก็รู้ดีว่าจะเรียกใช้เมธอดใดเนื่องจากจะพิจารณาประเภทของตัวแปร
Integer
int