Trong quá trình lập trình Java, bạn có thể gặp lỗi ambiguous method call khi biên dịch. Đây là tình huống xảy ra khi trình biên dịch không thể xác định phương thức nào cần được gọi do sự trùng lặp hoặc mơ hồ trong khai báo.
Bài viết này sẽ giúp bạn hiểu rõ nguyên nhân, ví dụ minh họa và cách khắc phục hiệu quả.

Nguyên nhân xảy ra lôi Java ambiguous method call
Ở đây, tôi sẽ giải thích vì sao lỗi java ambiguous method call xảy ra kèm với một số ví dụ. Lỗi ambiguous method call này luôn xuất hiện trong trường hợp method overloading, khi compiler không thể xác định được phương thức overload nào nên được sử dụng. Giả sử chúng ta có một chương trình Java như dưới đây.
package com.journaldev.errors;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(String s) {
System.out.println("String");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Chương trình trên biên dịch hoàn toàn bình thường và khi chạy, nó in ra “String”. Như vậy, phương thức foo(String s) đã được gọi. Lý do là bởi java compiler sẽ cố gắng tìm phương thức có tham số đầu vào cụ thể nhất để thực thi. Ta biết rằng Object là lớp cha của String, nên lựa chọn này khá rõ ràng. Dưới đây là trích dẫn từ Java Language Specification:
Lý do tôi truyền “null” là vì giá trị này có thể phù hợp với bất kỳ kiểu tham số nào. Nếu ta truyền một object cụ thể, compiler của Java sẽ dễ dàng xác định được phương thức nào cần gọi.
The method X is ambiguous for the type Y
Bây giờ, hãy thêm phương thức dưới đây vào đoạn code trên.
public void foo(Integer i){
System.out.println("Integer");
}

Bạn sẽ gặp lỗi compile time error như sau: The method foo(Object) is ambiguous for the type Test, vì cả lớp String và Integer đều có lớp cha là Object và không có quan hệ kế thừa với nhau. Do đó, compiler của Java không coi phương thức nào cụ thể hơn, dẫn đến lỗi ambiguous method call.
package com.journaldev.strings;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(Exception e) {
System.out.println("Exception");
}
public void foo(NullPointerException ne) {
System.out.println("NullPointerException");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
Như đã giải thích ở trên, trong trường hợp này foo(NullPointerException ne) là phương thức cụ thể nhất vì nó được kế thừa từ lớp Exception, do đó đoạn code này biên dịch bình thường và khi chạy sẽ in ra “NullPointerException”.
Tôi hy vọng bài viết này đã làm rõ mọi thắc mắc của bạn về lỗi java ambiguous method call compiler error, vui lòng để lại bình luận nếu bạn muốn bổ sung điều gì hoặc vẫn còn chỗ chưa rõ.