Android Studio - Gọi phương thức mơ hồ getClass ()


130

Tôi đang sử dụng Android Studio cho ứng dụng Android của mình.
Mã của tôi hoạt động và biên dịch.
Gần đây, IDE hiển thị lỗi cho tôi (dòng màu đỏ) trên getClass của đoạn mã sau:

fragment.getClass().getSimpleName()

Nhưng ứng dụng vẫn biên dịch và chạy.
Lỗi là:

Ambiguous method call. Both
getClass () in Object and
getClass () in Object match.

Ai đó có thể giải thích cho tôi những gì về nó? và tại sao mã vẫn chạy?



Tôi gặp lỗi tương tự, nhưng tôi vẫn có thể lắp ráp và chạy ứng dụng tốt.
Jason Robinson

Câu trả lời:


255

Tôi nghĩ đó là một lỗi trong Android Studio. Như chúng ta đã biết, Android Studio dựa trên Nền tảng IntelliJ và chức năng hiện có của IntelliJ IDEA Community Edition.

Google đã phát triển nó hợp tác với JetBrains. Và lỗi tương tự cũng được báo cáo xảy ra trong IntelliJ. Hãy xem báo cáo Lỗi

Cách giải quyết duy nhất cho vấn đề này là đưa ra trường hợp bạn gọi getClass(), Objectnhư sau:

((Object) this).getClass()

20
bây giờ không thành vấn đề ... RẤT NHIỀU UPVOTES :)
Sam

1
@RiteshGune xem câu trả lời của tôi dưới đây
James Wald

11
Sửa đổi mã để khắc phục lỗi trong IDE không phải là một giải pháp.
Jeffrey Blattman

2
Nó không hoạt động, hoặc ít nhất là không hiện tại (Android Studio 0.8.9)
Konrad Morawski

2
Hơn một năm sau và nó vẫn chưa được sửa :(
Kai

73

Thay vì sửa đổi mã ứng dụng của bạn, bạn có thể tránh lỗi này bằng cách vá mã nguồn SDK của Android.

Khi bạn gặp phải lỗi getClass (), hãy đi đến khai báo của phương thức (⌘B trên Mac). Điều này sẽ điều hướng đến một đường dẫn như $ANDROID_HOME/sources/android-20/java/lang/Object.java. Bây giờ, trong IntelliJ hoặc Android Studio:

  • Viết Object.javađược bằng cách chọnFile -> Make File Writable . Bạn có thể được nhắc làm điều này tự động nếu bạn cố chỉnh sửa tệp.
  • Xóa ký tự đại diện không giới hạn:

    // Xóa ký tự đại diện không liên kết (Lớp) để tránh http://youtrack.jetbrains.com/su/IDEA-72835 Lớp bản địa cuối cùng công khai getClass ();

Các phiên bản mới hơn của Android Studio dường như bị lỗi khiến bạn không thể chỉnh sửa tệp ngay cả sau khi khai báo là có thể ghi. Thay vào đó, hãy sao chép đường dẫn Edit -> Copy Pathhoặc ⇧⌘C và chỉnh sửa nó trong trình chỉnh sửa yêu thích của bạn.

Thay đổi này sẽ duy trì chức năng điều hướng nguồn. Sự lựa chọn khác:

  • Bạn có thể nhận xét toàn bộ getClass() tuyên bố.
  • Bạn có thể nối một phần mở rộng không phải Java vào tên của Object.javatệp, vd Object.java.in.

James Wald, câu trả lời hay, + 1
Ritesh Gune

2
Thật ra tôi nghĩ đây nên là câu trả lời được chấp nhận.
Thomas Keller

1
Đã cập nhật câu trả lời để phản ánh thực tế rằng Android Studio có một lỗi không cho phép Object.javachỉnh sửa ngay cả sau khi xóa cờ chỉ đọc.
James Wald

2
Dưới đây là báo cáo lỗi Android Studio .
Phil

Chỉ nhận xét phương thức getClass khiến IntelliJ / Studio phàn nàn về instance.getClass()(chỉ getClass()hoạt động). Đổi tên Object.javatập tin để vô hiệu hóa nó hoạt động.
Pierre-Luc Paour

9

Truyền "getClass" của bạn cho một đối tượng, sử dụng

((Object) this).getClass()

Đối với những người có vấn đề này với các mảnh vỡ, sử dụng

((Object) fragment).getClass()

3
Trên thực tế, bạn không bỏ kết quả getClass (), bạn bỏ đối tượng mà bạn đang ở ngay bây giờ (cái này) để được coi là một Đối tượng.
Jorge Aguilar

6
Điều này có lẽ xứng đáng với huy chương vàng cho cách giải quyết khét tiếng nhất từng được Java IDE yêu cầu. Truyền đối tượng Java thành đối tượng, không gian ấn tượng.
Snicolas

8

Trước hết, vấn đề Android Studio liên quan là ở đây . Hãy đánh dấu sao để nó có thể được chú ý!

Ngoài ra vấn đề IntelliJ có liên quan ở đây .

Một cách giải quyết tốt cho việc này là đổi tên <sdk>/android-<platform>/java/lang/Object.javathànhObject.java.XXX ví dụ. Điều này sẽ ngăn AS nhìn thấy nó và vấn đề sẽ được tránh. Tất nhiên, bằng cách này, bạn không còn có thể dễ dàng điều hướng đến nguồn Object từ bên trong AS.

Bạn có thể đổi tên tệp trở lại tên ban đầu khi lỗi này sẽ được sửa ...


2

Hôm nay tôi gặp vấn đề tương tự khi tôi tạo một dự án mới. Tôi đã so sánh với một dự án khác không có vấn đề này và tìm thấy một sự khác biệt. Dự án cũ được xây dựng dựa trên "Android 4.2.2" trong khi dự án mới theo mặc định được đặt thành "Nền tảng API Android 19". Tôi đã thay đổi thành "Android 4.2.2" bằng API 17 và dấu lỗi màu đỏ đã biến mất. API 17 là đủ cho dự án của tôi vì vậy tôi có thể để nó theo cách này. Tôi không biết tại sao điều này giải quyết vấn đề, thành thật mà nói.


1

Tôi tìm thấy một sửa chữa cho điều này, ít nhất là vào cuối của tôi. Đây chắc chắn là một lỗi IntelliJ, nhưng dường như nguyên nhân là do xung đột giữa các lớp trong đường dẫn nguồn và đường dẫn lớp cho SDK Android.

Nếu bạn đi đến Cấu trúc dự án> SDK> {{SDK Android của bạn}}, hãy xóa mọi mục nhập Android khỏi tab Sourcepath. Vấn đề với cách giải quyết này là bạn không còn có quyền truy cập trực tiếp vào các nguồn từ bên trong IntelliJ / Android Studio.

Tôi đã đăng cùng một thông tin trên trình theo dõi sự cố Jetbrains , vì vậy hy vọng chúng ta sẽ sớm thấy cách khắc phục.


Bây giờ có một sửa chữa. Nó có thể sẽ được bao gồm trong v0.9.3
pfmaggi

1

Chỉ cần sử dụng Fragment. Class.getSimpleName ();

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.