Android Studio - metode panggilan getClass ()

130

Saya menggunakan Android Studio untuk aplikasi Android saya.
Kode saya berfungsi dan dikompilasi.
Baru-baru ini, IDE menunjukkan saya kesalahan (garis merah) di getClass dari kode berikut:

fragment.getClass().getSimpleName()

Tetapi aplikasi tetap mengkompilasi dan berjalan.
Kesalahannya adalah:

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

Bisakah seseorang menjelaskan kepada saya tentang apa? dan mengapa kodenya masih berjalan?

NickF
sumber
Saya mendapatkan kesalahan yang sama, tetapi saya masih bisa merakit dan menjalankan aplikasinya dengan baik.
Jason Robinson

Jawaban:

255

Saya pikir itu adalah bug di Android Studio. Seperti yang kita ketahui, Android Studio didasarkan pada Platform IntelliJ dan fungsi yang ada dari Edisi Komunitas IntelliJ IDEA.

Google telah mengembangkannya bekerja sama dengan JetBrains. Dan bug yang sama juga dilaporkan terjadi di IntelliJ. Lihat laporan Kesalahan

Satu-satunya solusi untuk masalah ini adalah dengan mengirimkan instance yang Anda panggil getClass(), Objectsebagai berikut:

((Object) this).getClass()
Ritesh Gune
sumber
20
tidak masalah sekarang ... SANGAT BANYAK PEMBARUAN :)
Sam
1
@RiteshGune lihat jawaban saya di bawah ini
James Wald
11
memodifikasi kode untuk mengatasi bug dalam IDE tidak banyak solusi.
Jeffrey Blattman
2
Tidak berfungsi, atau setidaknya saat ini tidak (Android Studio 0.8.9)
Konrad Morawski
2
Lebih dari setahun kemudian dan itu masih belum diperbaiki :(
Kai
73

Daripada mengubah kode aplikasi Anda, Anda dapat menghindari bug ini dengan menambal kode sumber Android SDK Anda.

Ketika Anda menemukan kesalahan getClass (), buka deklarasi metode (⌘B pada Mac). Ini akan menavigasi ke jalur seperti $ANDROID_HOME/sources/android-20/java/lang/Object.java. Sekarang, di dalam IntelliJ atau Android Studio:

  • Buat tulisan Object.javadengan memilih File -> Make File Writable. Anda mungkin diminta untuk melakukan ini secara otomatis jika Anda mencoba mengedit file.
  • Hapus wildcard tak terbatas:

    // Menghapus wildcard (Class) yang tidak dibatasi untuk menghindari http://youtrack.jetbrains.com/issue/IDEA-72835 final public asli getClass Class ();

Versi Android Studio yang lebih baru tampaknya menderita bug yang mencegah Anda mengedit file bahkan setelah menyatakannya sebagai dapat ditulis. Alih-alih, salin jalurnya, Edit -> Copy Pathatau ⇧⌘C, dan edit di editor favorit Anda.

Perubahan ini akan mempertahankan fungsi navigasi sumber. Pilihan lain:

  • Anda dapat mengomentari seluruh getClass()deklarasi.
  • Anda dapat menambahkan ekstensi non-Jawa ke nama Object.javafile, misalnya Object.java.in.
James Wald
sumber
James Wald, jawaban yang bagus, +1
Ritesh Gune
2
Sebenarnya saya pikir ini harus menjadi jawaban yang diterima.
Thomas Keller
1
Diperbarui jawaban untuk mencerminkan fakta bahwa Android Studio memiliki bug yang tidak memungkinkan Object.javauntuk diedit bahkan setelah menghapus tanda baca-saja.
James Wald
2
Berikut adalah laporan bug Android Studio .
Phil
Hanya mengomentari metode getClass menyebabkan IntelliJ / Studio mengeluh tentang instance.getClass()(hanya getClass()berfungsi). Mengganti nama Object.javafile untuk menonaktifkannya tidak berfungsi.
Pierre-Luc Paour
9

Keluarkan "getClass" Anda ke Objek, gunakan

((Object) this).getClass()

Bagi mereka yang memiliki masalah dengan fragmen, gunakan

((Object) fragment).getClass()
AnhSirk Dasarp
sumber
3
Sebenarnya, Anda tidak melemparkan hasil getClass (), Anda melemparkan objek di mana Anda berada sekarang (ini) untuk diperlakukan sebagai Obyek.
Jorge Aguilar
6
Ini mungkin layak mendapatkan medali emas untuk solusi paling terkenal yang pernah dibutuhkan oleh Java IDE. Casting Obyek Java ke Objek, kekosongan mengesankan.
Snicolas
8

Pertama-tama masalah Android Studio terkait ada di sini . Tolong beri bintang sehingga bisa mendapat perhatian!

Juga masalah IntelliJ terkait ada di sini .

Solusi yang baik untuk ini adalah mengubah nama <sdk>/android-<platform>/java/lang/Object.javamenjadi Object.java.XXXmisalnya. Ini akan mencegah AS untuk melihatnya dan masalah ini akan dihindari. Tentu saja dengan melakukan ini, Anda tidak dapat lagi dengan mudah menavigasi ke sumber Obyek dari dalam AS.

Anda dapat mengganti nama file kembali ke nama aslinya saat bug ini diperbaiki ...

Direksi
sumber
2

Hari ini saya mengalami masalah yang sama ketika saya membuat proyek baru. Saya dibandingkan dengan proyek lain yang tidak memiliki masalah ini dan menemukan satu perbedaan. Proyek lama dibangun melawan "Android 4.2.2" sementara yang baru secara default diatur ke "Android API 19 Platform". Saya mengubahnya menjadi "Android 4.2.2" yang sama dengan API 17 dan penanda kesalahan merah menghilang. API 17 sudah cukup untuk proyek saya sehingga saya bisa membiarkannya seperti ini. Saya tidak tahu mengapa ini menyelesaikan masalah, jujur ​​saja.

Uwe Post
sumber
1

Saya menemukan perbaikan untuk ini, setidaknya di ujung saya. Ini jelas merupakan bug IntelliJ, tetapi tampaknya disebabkan oleh konflik antara kelas-kelas di sourcepath dan di classpath untuk Android SDK.

Jika Anda pergi ke Struktur Proyek> SDK> {{SDK Android Anda}}, hapus semua entri Android dari tab Sourcepath. Masalah dengan solusi ini adalah bahwa Anda tidak lagi memiliki akses langsung ke sumber dari dalam IntelliJ / Android Studio.

Saya telah memposting informasi yang sama pada pelacak masalah Jetbrains , jadi semoga kami akan segera memperbaikinya.

Kevin Coppock
sumber
Sekarang ada perbaikan. Mungkin akan dimasukkan dalam v0.9.3
pfmaggi
1

Cukup gunakan fragment.class.getSimpleName ();

Sotti
sumber