ในขณะที่อาจมีกรณีที่ถูกต้องซึ่งวิธีการบรรทุกเกินพิกัดดังกล่าวอาจไม่ชัดเจนทำไมคอมไพเลอร์ไม่อนุญาตรหัสที่ไม่ชัดเจนในเวลารวบรวมหรือเวลาทำงาน?
ตัวอย่าง:
// This fails:
def foo(a: String)(b: Int = 42) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// This fails, too. Even if there is no position in the argument list,
// where the types are the same.
def foo(a: Int) (b: Int = 42) = a + b
def foo(a: String)(b: String = "Foo") = a + b
// This is OK:
def foo(a: String)(b: Int) = a + b
def foo(a: Int) (b: Int = 42) = a + b
// Even this is OK.
def foo(a: Int)(b: Int) = a + b
def foo(a: Int)(b: String = "Foo") = a + b
val bar = foo(42)_ // This complains obviously ...
มีเหตุผลใดบ้างที่ทำให้ข้อ จำกัด เหล่านี้ไม่สามารถคลายได้บ้าง?
โดยเฉพาะอย่างยิ่งเมื่อทำการแปลงโค้ด Java ที่มีการโอเวอร์โหลดอย่างมากเป็นอาร์กิวเมนต์เริ่มต้นของ Scala นั้นเป็นสิ่งที่สำคัญมากและมันก็ไม่ดีที่จะหาคำตอบหลังจากเปลี่ยนวิธี Java มากมายโดยวิธี Scala หนึ่งวิธีที่ spec / compiler กำหนดข้อ จำกัด โดยพลการ
object Test { def a[A](b: Int, c: Int, d: Int = 7): Unit = {}; def a[A](a:String, b: String = ""): Unit = {}; a(2,3,4); a("a");}