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?
android
android-studio
NickF
sumber
sumber
Jawaban:
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()
,Object
sebagai berikut:sumber
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:Object.java
dengan memilihFile -> 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 Path
atau ⇧⌘C, dan edit di editor favorit Anda.Perubahan ini akan mempertahankan fungsi navigasi sumber. Pilihan lain:
getClass()
deklarasi.Object.java
file, misalnyaObject.java.in
.sumber
Object.java
untuk diedit bahkan setelah menghapus tanda baca-saja.instance.getClass()
(hanyagetClass()
berfungsi). Mengganti namaObject.java
file untuk menonaktifkannya tidak berfungsi.Keluarkan "getClass" Anda ke Objek, gunakan
Bagi mereka yang memiliki masalah dengan fragmen, gunakan
sumber
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.java
menjadiObject.java.XXX
misalnya. 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 ...
sumber
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.
sumber
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.
sumber
Cukup gunakan fragment.class.getSimpleName ();
sumber