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 ก็รู้ดีว่าจะเรียกใช้เมธอดใดเนื่องจากจะพิจารณาประเภทของตัวแปร
Integerint