Android Studio - Mehrdeutiger Methodenaufruf getClass ()

130

Ich verwende Android Studio für meine Android-Anwendung.
Mein Code funktioniert und kompiliert.
Vor kurzem zeigt mir die IDE einen Fehler (rote Linien) auf getClass mit folgendem Code:

fragment.getClass().getSimpleName()

Trotzdem wird die Anwendung kompiliert und ausgeführt.
Der Fehler ist:

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

Kann mir jemand erklären, worum es geht? und warum läuft der Code noch?

NickF
quelle
Ich erhalte den gleichen Fehler, kann die App aber trotzdem zusammenbauen und ausführen.
Jason Robinson

Antworten:

255

Ich denke, es ist ein Fehler in Android Studio. Wie wir wissen, basiert Android Studio auf der IntelliJ-Plattform und den vorhandenen Funktionen der IntelliJ IDEA Community Edition.

Google hat es in Zusammenarbeit mit JetBrains entwickelt. Der gleiche Fehler soll auch in IntelliJ auftreten. Schauen Sie sich den Fehlerbericht an

Die einzige Abhilfe für dieses Problem ist die Instanz , die Sie rufen werfen getClass()auf, um Objectwie folgt:

((Object) this).getClass()
Ritesh Gune
quelle
20
spielt jetzt keine Rolle ... SO VIEL UPVOTES :)
Sam
1
@ RiteshGune siehe meine Antwort unten
James Wald
11
Das Ändern von Code, um einen Fehler in einer IDE zu umgehen, ist keine gute Lösung.
Jeffrey Blattman
2
Es funktioniert nicht oder zumindest derzeit nicht (Android Studio 0.8.9)
Konrad Morawski
2
Mehr als ein Jahr später und es ist immer noch nicht behoben :(
Kai
73

Anstatt Ihren Anwendungscode zu ändern, können Sie diesen Fehler vermeiden, indem Sie den Quellcode Ihres Android SDK patchen.

Wenn Sie auf den Fehler getClass () stoßen, wechseln Sie zur Deklaration der Methode (⌘B auf Mac). Dadurch wird zu einem Pfad wie z $ANDROID_HOME/sources/android-20/java/lang/Object.java. Jetzt in IntelliJ oder Android Studio:

  • Machen Object.javabeschreibbar durch die Wahl File -> Make File Writable. Sie werden möglicherweise automatisch dazu aufgefordert, wenn Sie versuchen, die Datei zu bearbeiten.
  • Entfernen Sie den unbegrenzten Platzhalter:

    // Unbegrenzten Platzhalter (Klasse) entfernt, um zu vermeiden http://youtrack.jetbrains.com/issue/IDEA-72835 public final native Class getClass ();

Neuere Versionen von Android Studio scheinen unter einem Fehler zu leiden, der Sie daran hindert, die Datei zu bearbeiten, selbst nachdem Sie sie als beschreibbar deklariert haben. Kopieren Sie stattdessen den Pfad Edit -> Copy Pathoder ⇧⌘C und bearbeiten Sie ihn in Ihrem bevorzugten Editor.

Durch diese Änderung bleibt die Quellennavigationsfunktion erhalten. Andere Optionen:

  • Sie können die gesamte getClass()Erklärung auskommentieren.
  • Sie können dem Namen der Object.javaDatei eine Nicht-Java-Erweiterung hinzufügen, z Object.java.in.
James Wald
quelle
James Wald, nette Antwort, + 1
Ritesh Gune
2
Eigentlich denke ich, dass dies die akzeptierte Antwort sein sollte.
Thomas Keller
1
Die Antwort wurde aktualisiert, um der Tatsache Rechnung zu tragen, dass Android Studio einen Fehler aufweist, der Object.javaauch nach dem Löschen des Nur-Lese-Flags nicht bearbeitet werden kann.
James Wald
2
Hier ist der Android Studio- Fehlerbericht.
Phil
Nur das Kommentieren der getClass-Methode führt dazu, dass sich IntelliJ / Studio beschwert instance.getClass()( getClass()funktioniert nur ). Das Umbenennen der Object.javaDatei zum Deaktivieren funktioniert.
Pierre-Luc Paour
9

Wirf deine "getClass" auf ein Objekt, benutze

((Object) this).getClass()

Verwenden Sie für diejenigen, die dieses Problem mit Fragmenten haben

((Object) fragment).getClass()
AnhSirk Dasarp
quelle
3
Tatsächlich wandeln Sie das Ergebnis getClass () nicht um, sondern das Objekt, in dem Sie sich gerade befinden (dies), um es als Objekt zu behandeln.
Jorge Aguilar
6
Dies verdient wahrscheinlich eine Goldmedaille für die berüchtigtste Problemumgehung, die jemals von einer Java-IDE gefordert wurde. Ein Java-Objekt in Objekt umwandeln, beeindruckende Leere.
Snicolas
8

Zuallererst ist das verwandte Android Studio-Problem hier . Bitte starte es, damit es etwas Aufmerksamkeit bekommt!

Auch das damit verbundene IntelliJ-Problem ist hier .

Eine gute Problemumgehung hierfür ist beispielsweise das Umbenennen <sdk>/android-<platform>/java/lang/Object.javain Object.java.XXX. Dies verhindert, dass AS es sieht, und das Problem wird vermieden. Auf diese Weise können Sie natürlich nicht mehr einfach von AS aus zur Objektquelle navigieren.

Sie können die Datei wieder in ihren ursprünglichen Namen umbenennen, wenn dieser Fehler behoben wird ...

BoD
quelle
2

Heute bin ich auf dasselbe Problem gestoßen, als ich ein neues Projekt erstellt habe. Ich habe mit einem anderen Projekt verglichen, das dieses Problem nicht hatte, und einen Unterschied festgestellt. Das alte Projekt wurde gegen "Android 4.2.2" erstellt, während das neue standardmäßig auf "Android API 19 Platform" eingestellt war. Ich habe das in "Android 4.2.2" geändert, was API 17 entspricht, und die rote Fehlermarkierung ist verschwunden. API 17 reicht für mein Projekt aus, damit ich es so belassen kann. Ich habe keine Ahnung, warum dies das Problem löst, um ehrlich zu sein.

Uwe Post
quelle
1

Ich habe eine Lösung dafür gefunden, zumindest an meinem Ende. Es ist definitiv ein IntelliJ-Fehler, aber er scheint durch einen Konflikt zwischen den Klassen im Quellpfad und im Klassenpfad für das Android SDK verursacht zu werden.

Wenn Sie zu Projektstruktur> SDKs> {{Ihr Android SDK}} wechseln, entfernen Sie alle Android-Einträge von der Registerkarte Quellpfad. Das Problem bei dieser Problemumgehung besteht darin, dass Sie in IntelliJ / Android Studio keinen direkten Zugriff mehr auf Quellen haben.

Ich habe die gleichen Informationen auf dem Jetbrains Issue Tracker veröffentlicht. Hoffentlich sehen wir bald eine Lösung.

Kevin Coppock
quelle
Es gibt jetzt eine Lösung. Es wird wahrscheinlich in v0.9.3
pfmaggi
1

Verwenden Sie einfach fragment.class.getSimpleName ();

Sotti
quelle