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?
android
android-studio
NickF
źródło
źródło
Odpowiedzi:
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, abyObject
w sposób następujący:((Object) this).getClass()
źródło
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:Object.java
zapis, wybierającFile -> 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 Path
lub ⇧⌘C i edytuj ją w swoim ulubionym edytorze.Ta zmiana zachowa funkcjonalność nawigacji źródła. Inne opcje:
getClass()
deklarację.Object.java
pliku, npObject.java.in
.źródło
Object.java
na edycję nawet po wyczyszczeniu flagi tylko do odczytu.instance.getClass()
(tylkogetClass()
działa). Zmiana nazwyObject.java
pliku, aby ją wyłączyć, działa.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()
źródło
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.java
naObject.java.XXX
np. 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 ...
źródło
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.
źródło
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ę.
źródło
Po prostu użyj fragment.class.getSimpleName ();
źródło