Android Studio - niejednoznaczne wywołanie metody getClass ()

130

Używam Android Studio do mojej aplikacji na Androida.
Mój kod działa i kompiluje się.
Ostatnio IDE wyświetla mi błąd (czerwone linie) na getClass następującego kodu:

fragment.getClass().getSimpleName()

Jednak aplikacja nadal się kompiluje i działa.
Błąd:

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

Czy ktoś może mi wyjaśnić, o co chodzi? i dlaczego kod nadal działa?

NickF
źródło
Otrzymuję ten sam błąd, ale nadal mogę poprawnie złożyć i uruchomić aplikację.
Jason Robinson

Odpowiedzi:

255

Myślę, że to błąd w Android Studio. Jak wiemy, Android Studio jest oparte na platformie IntelliJ i istniejącej funkcjonalności IntelliJ IDEA Community Edition.

Google opracował go we współpracy z JetBrains. Ten sam błąd występuje również w IntelliJ. Zapoznaj się z raportem błędów

Jedyne obejście do tej kwestii jest do oddania instancję zadzwonić getClass()na, aby Objectw sposób następujący:

((Object) this).getClass()
Ritesh Gune
źródło
20
nie ma teraz znaczenia ... TAK DUŻO POPULARÓW :)
Sam
1
@RiteshGune zobacz moją odpowiedź poniżej
James Wald
11
modyfikowanie kodu w celu obejścia błędu w IDE nie jest wielkim rozwiązaniem.
Jeffrey Blattman,
2
To nie działa, a przynajmniej nie obecnie (Android Studio 0.8.9)
Konrad Morawski
2
Ponad rok później i nadal nie jest to naprawione :(
Kai
73

Zamiast modyfikować kod aplikacji, możesz uniknąć tego błędu , poprawiając kod źródłowy zestawu Android SDK.

Gdy napotkasz błąd getClass (), przejdź do deklaracji metody (⌘B na Macu). Spowoduje to przejście do ścieżki, takiej jak $ANDROID_HOME/sources/android-20/java/lang/Object.java. Teraz w IntelliJ lub Android Studio:

  • Udostępnij Object.javazapis, wybierając File -> Make File Writable. Możesz zostać poproszony o zrobienie tego automatycznie, jeśli spróbujesz edytować plik.
  • Usuń nieograniczony symbol wieloznaczny:

    // Usunięto nieograniczony symbol wieloznaczny (Class), aby uniknąć http://youtrack.jetbrains.com/issue/IDEA-72835 publicznej końcowej klasy natywnej getClass ();

Wydaje się, że nowsze wersje Android Studio mają błąd, który uniemożliwia edycję pliku nawet po zadeklarowaniu go jako umożliwiającego zapis. Zamiast tego skopiuj ścieżkę Edit -> Copy Pathlub ⇧⌘C i edytuj ją w swoim ulubionym edytorze.

Ta zmiana zachowa funkcjonalność nawigacji źródła. Inne opcje:

  • Możesz skomentować całą getClass()deklarację.
  • Możesz dołączyć rozszerzenie inne niż Java do nazwy Object.javapliku, np Object.java.in.
James Wald
źródło
James Wald, dobra odpowiedź, +1
Ritesh Gune
2
Właściwie uważam, że to powinna być akceptowana odpowiedź.
Thomas Keller
1
Zaktualizowano odpowiedź, aby odzwierciedlić fakt, że Android Studio ma błąd, który nie pozwala Object.javana edycję nawet po wyczyszczeniu flagi tylko do odczytu.
James Wald,
2
Tutaj jest Android Studio raport o błędzie.
Phil
Tylko komentowanie metody getClass powoduje, że IntelliJ / Studio narzeka instance.getClass()(tylko getClass()działa). Zmiana nazwy Object.javapliku, aby ją wyłączyć, działa.
Pierre-Luc Paour
9

Prześlij swoją „getClass” do obiektu, użyj

((Object) this).getClass()

Dla tych, którzy mają ten problem z fragmentami, użyj

((Object) fragment).getClass()
AnhSirk Dasarp
źródło
3
W rzeczywistości nie rzutujesz wyniku getClass (), lecz obiekt, w którym się teraz znajdujesz (this), jest traktowany jako Object.
Jorge Aguilar,
6
To prawdopodobnie zasługuje na złoty medal za najbardziej niesławne obejście, jakie kiedykolwiek wymagało środowisko Java IDE. Przesyłanie obiektu Java do obiektu, imponująca pustka.
Snicolas
8

Przede wszystkim powiązany problem z Android Studio jest tutaj . Oznacz go gwiazdką, aby przyciągnął uwagę!

Również powiązany problem z IntelliJ jest tutaj .

Dobrym obejście tego jest to, aby zmienić nazwę <sdk>/android-<platform>/java/lang/Object.javana Object.java.XXXnp. Zapobiegnie to zobaczeniu go przez AS i unikniemy problemu. Oczywiście w ten sposób nie można już łatwo przejść do źródła Object z poziomu AS.

Możesz zmienić nazwę pliku z powrotem na jego oryginalną nazwę, gdy ten błąd zostanie naprawiony ...

BoD
źródło
2

Dzisiaj napotkałem ten sam problem, kiedy tworzyłem nowy projekt. Porównałem do innego projektu, który nie miał tego problemu i znalazłem jedną różnicę. Stary projekt został zbudowany na systemie „Android 4.2.2”, podczas gdy nowy był domyślnie ustawiony na „platformę Android API 19”. Zmieniłem to na „Android 4.2.2”, co odpowiada API 17 i czerwony znacznik błędu zniknął. API 17 jest wystarczające dla mojego projektu, więc mogę to tak zostawić. Nie mam pojęcia, dlaczego to rozwiązuje problem, szczerze mówiąc.

Uwe Post
źródło
1

Znalazłem na to rozwiązanie, przynajmniej z mojej strony. Jest to z pewnością błąd IntelliJ, ale wydaje się, że jest spowodowany konfliktem między klasami w ścieżce źródłowej i ścieżce klas dla Android SDK.

Jeśli przejdziesz do opcji Struktura projektu> SDK> {{Your Android SDK}}, usuń wszystkie wpisy Androida z karty Sourcepath. Problem z tym obejściem polega na tym, że nie masz już bezpośredniego dostępu do źródeł z poziomu IntelliJ / Android Studio.

Opublikowałem te same informacje w narzędziu do śledzenia problemów Jetbrains , więc miejmy nadzieję, że wkrótce zobaczymy poprawkę.

Kevin Coppock
źródło
Teraz jest poprawka. Prawdopodobnie zostanie uwzględniony w wersji 0.9.3
pfmaggi
1

Po prostu użyj fragment.class.getSimpleName ();

Sotti
źródło