Android Studio - GetClass () belirsiz yöntem çağrısı


130

Android uygulamam için Android Studio kullanıyorum.
Kodum çalışıyor ve derleniyor.
Son zamanlarda, IDE aşağıdaki kodun getClass'ında bana hata (kırmızı çizgiler) gösteriyor:

fragment.getClass().getSimpleName()

Ancak yine de uygulama derler ve çalışır.
Hata şudur:

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

Biri bana ne hakkında olduğunu açıklayabilir mi? ve kod neden hala çalışıyor?



Aynı hatayı alıyorum, ancak yine de uygulamayı bir araya getirip çalıştırabilirim.
Jason Robinson

Yanıtlar:


255

Android Studio'da bir hata olduğunu düşünüyorum. Bildiğimiz gibi, Android Studio, IntelliJ Platformuna ve IntelliJ IDEA Community Edition'ın mevcut işlevselliğine dayanmaktadır.

Google bunu JetBrains ile işbirliği içinde geliştirdi. Ve aynı hatanın IntelliJ'de de olduğu bildiriliyor. Hata raporuna bir göz atın

Bu sorunun tek çözümü , aradığınız örneği aşağıdaki gibi getClass()yayınlamaktır Object:

((Object) this).getClass()

20
artık önemi ... ÇOK upvotes :) yapar
Sam

1
@RiteshGune aşağıdaki cevabımı görün
James Wald

11
IDE'deki bir hatayı çözmek için kodu değiştirmek pek bir çözüm değildir.
Jeffrey Blattman

2
Çalışmıyor veya en azından şu anda çalışmıyor (Android Studio 0.8.9)
Konrad Morawski

2
Bir yıldan fazla bir süre geçti ve hala düzeltilmedi :(
Kai

73

Uygulama kodunuzu değiştirmek yerine , Android SDK'nızın kaynak koduna yama uygulayarak bu hatayı önleyebilirsiniz .

GetClass () hatasıyla karşılaştığınızda, yöntemin bildirimine gidin (Mac'te ⌘B). Bu, gibi bir yola gidecektir $ANDROID_HOME/sources/android-20/java/lang/Object.java. Şimdi, IntelliJ veya Android Studio'da:

  • Object.javaSeçerek yazılabilir yapın File -> Make File Writable. Dosyayı düzenlemeye çalışırsanız, bunu otomatik olarak yapmanız istenebilir.
  • Sınırsız joker karakteri kaldırın:

    // http://youtrack.jetbrains.com/issue/IDEA-72835 genel nihai yerel Sınıf getClass () ' ı önlemek için sınırsız joker karakter (Sınıf) kaldırıldı ;

Android Studio'nun daha yeni sürümleri, dosyayı yazılabilir olarak bildirdikten sonra bile düzenlemenizi engelleyen bir hatadan muzdarip görünüyor. Bunun yerine, yolu Edit -> Copy Pathveya ⇧⌘C'yi kopyalayın ve en sevdiğiniz düzenleyicide düzenleyin.

Bu değişiklik, kaynak gezinme işlevini koruyacaktır. Diğer seçenekler:

  • getClass()Beyannamenin tamamını yorumlayabilirsiniz .
  • Object.javaDosya adına Java dışı bir uzantı ekleyebilirsiniz , örn Object.java.in.

James Wald, güzel cevap, + 1
Ritesh Gune

2
Aslında bunun kabul edilen cevap olması gerektiğini düşünüyorum.
Thomas Keller

1
Yanıt, Android Studio'nun Object.javasalt okunur bayrağı temizledikten sonra bile düzenlenmesine izin vermeyen bir hataya sahip olduğu gerçeğini yansıtacak şekilde güncellendi .
James Wald

2
İşte olan Android Studio hata raporu.
Phil

Yalnızca getClass yöntemini yorumlamak IntelliJ / Studio'nun şikayet etmesine neden olur instance.getClass()(yalnızca getClass()çalışır). Devre Object.javadışı bırakmak için dosyayı yeniden adlandırmak işe yarıyor.
Pierre-Luc Paour

9

"GetClass" dosyanızı bir Nesneye yayınlayın,

((Object) this).getClass()

Parçalarla bu sorunu yaşayanlar için kullanın

((Object) fragment).getClass()

3
Aslında getClass () sonucunu çevirmezsiniz, şu anda içinde bulunduğunuz nesneyi (bu) bir Nesne olarak ele alınacak şekilde çevirirsiniz.
Jorge Aguilar

6
Bu muhtemelen bir Java IDE'nin gerektirdiği en kötü şöhretli geçici çözüm için altın madalyayı hak ediyor. Bir Java Nesnesini Nesneye Çevirmek, etkileyici boşluk.
Snicolas

8

Öncelikle ilgili Android Studio sorunu burada . Dikkat çekebilmesi için lütfen yıldız ekleyin!

Ayrıca ilgili IntelliJ sorunu da burada .

Bunun için iyi bir çözüm adlandırmak etmektir <sdk>/android-<platform>/java/lang/Object.javaiçin Object.java.XXXmesela. Bu, AS'nin bunu görmesini engelleyecek ve sorun önlenecektir. Elbette bunu yaparak AS içinden Object kaynağına artık kolayca gidemezsiniz.

Bu hata giderildiğinde dosyayı orijinal adına yeniden adlandırabilirsiniz ...


2

Bugün yeni bir proje oluştururken aynı problemle karşılaştım. Bu sorunu olmayan başka bir projeyle karşılaştırdım ve bir fark buldum. Eski proje "Android 4.2.2" ye göre oluşturuldu, yenisi ise varsayılan olarak "Android API 19 Platformu" olarak ayarlandı. Bunu, API 17'ye eşit olan "Android 4.2.2" olarak değiştirdim ve kırmızı hata işareti kayboldu. API 17 projem için yeterli yani bu şekilde bırakabilirim. Dürüst olmak gerekirse, bunun neden sorunu çözdüğüne dair hiçbir fikrim yok.


1

En azından kendi tarafımda bunun için bir düzeltme buldum. Kesinlikle bir IntelliJ hatasıdır, ancak kaynak yolundaki ve Android SDK için sınıf yolundaki sınıflar arasındaki bir çatışmadan kaynaklanıyor gibi görünüyor.

Proje Yapısı> SDK'lar> {{Android SDK'nız}} seçeneğine giderseniz, Sourcepath sekmesinden tüm Android girişlerini kaldırın. Bu geçici çözümle ilgili sorun, artık IntelliJ / Android Studio içinden kaynaklara doğrudan erişiminizin olmamasıdır.

Aynı bilgileri Jetbrains sorun izleyicisine de gönderdim , bu yüzden umarım yakında bir düzeltme göreceğiz.


Şimdi bir düzeltme var. Muhtemelen v0.9.3'e dahil edilecek
pfmaggi

1

Sadece fragment.class.getSimpleName () kullanın;

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.