Android Studio - Chiamata metodo ambigua getClass ()


130

Sto usando Android Studio per la mia applicazione Android.
Il mio codice funziona e viene compilato.
Di recente, l'IDE mi mostra un errore (linee rosse) su getClass del seguente codice:

fragment.getClass().getSimpleName()

Tuttavia, l'applicazione viene compilata ed eseguita.
L'errore è:

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

Qualcuno può spiegarmi di cosa si tratta? e perché il codice è ancora in esecuzione?



Ottengo lo stesso errore, ma posso ancora assemblare ed eseguire l'app in modo corretto.
Jason Robinson,

Risposte:


255

Penso che sia un bug in Android Studio. Come sappiamo, Android Studio si basa sulla piattaforma IntelliJ e sulle funzionalità esistenti di IntelliJ IDEA Community Edition.

Google lo ha sviluppato in collaborazione con JetBrains. E lo stesso bug è segnalato anche in IntelliJ. Dai un'occhiata al rapporto errori

L'unica soluzione a questo problema è eseguire il cast dell'istanza chiamata getClass(), Objectcome segue:

((Object) this).getClass()

20
non importa adesso ... TANTI MIGLIORAMENTI :)
Sam

1
@RiteshGune vedi la mia risposta qui sotto
James Wald,

11
la modifica del codice per aggirare un bug in un IDE non è molto una soluzione.
Jeffrey Blattman,

2
Non funziona, o almeno non attualmente (Android Studio 0.8.9)
Konrad Morawski,

2
Più di un anno dopo e non è ancora stato risolto :(
Kai

73

Invece di modificare il codice dell'applicazione, è possibile evitare questo errore rattoppando il codice sorgente dell'SDK Android.

Quando si riscontra l'errore getClass (), andare alla dichiarazione del metodo (⌘B su Mac). Questo passerà a un percorso come $ANDROID_HOME/sources/android-20/java/lang/Object.java. Ora, in IntelliJ o Android Studio:

  • Rendi Object.javascrivibile scegliendo File -> Make File Writable. È possibile che venga richiesto di eseguire questa operazione automaticamente se si tenta di modificare il file.
  • Rimuovere il carattere jolly non associato:

    // Rimosso jolly illimitato (Classe) per evitare http://youtrack.jetbrains.com/issue/IDEA-72835 Classe nativa finale pubblica getClass ();

Le versioni più recenti di Android Studio sembrano soffrire di un bug che impedisce di modificare il file anche dopo averlo dichiarato scrivibile. Invece, copia il percorso, Edit -> Copy Patho ⇧⌘C, e modificalo nel tuo editor preferito.

Questa modifica manterrà la funzionalità di navigazione di origine. Altre opzioni:

  • Puoi commentare l'intera getClass()dichiarazione.
  • È possibile aggiungere un'estensione non Java al nome del Object.javafile, ad es Object.java.in.

James Wald, bella risposta, + 1
Ritesh Gune

2
In realtà penso che questa dovrebbe essere la risposta accettata.
Thomas Keller,

1
Aggiornato la risposta per riflettere il fatto che Android Studio ha un bug che non consente Object.javadi essere modificato anche dopo aver cancellato il flag di sola lettura.
James Wald,

2
Ecco la segnalazione di bug di Android Studio .
Phil

Solo commentando il metodo getClass, IntelliJ / Studio si lamenta instance.getClass()( getClass()funziona solo ). Rinominare il Object.javafile per disabilitarlo funziona.
Pierre-Luc Paour,

9

Trasmetti "getClass" a un oggetto, usa

((Object) this).getClass()

Per coloro che hanno questo problema con i frammenti, usare

((Object) fragment).getClass()

3
In realtà, non si lancia il risultato getClass (), si lancia l'oggetto in cui ci si trova ora (questo) per essere trattato come un oggetto.
Jorge Aguilar,

6
Questo probabilmente merita una medaglia d'oro per la soluzione più famigerata mai richiesta da un IDE Java. Lanciare un oggetto Java su oggetto, un'impressionante vacuità.
Snicolas,

8

Prima di tutto il problema relativo a Android Studio è qui . Si prega di recitare in modo che possa attirare l'attenzione!

Anche il relativo problema IntelliJ è qui .

Una buona soluzione per questo è rinominare <sdk>/android-<platform>/java/lang/Object.javaad Object.java.XXXesempio. Ciò impedirà a AS di vederlo e il problema verrà evitato. Ovviamente, facendo questo, non è più possibile navigare facilmente verso la fonte dell'Oggetto all'interno di AS.

Puoi rinominare il file con il nome originale quando questo bug verrà corretto ...


2

Oggi ho riscontrato lo stesso problema quando ho creato un nuovo progetto. Ho confrontato con un altro progetto che non aveva questo problema e ho trovato una differenza. Il vecchio progetto era basato su "Android 4.2.2" mentre il nuovo era impostato di default su "Piattaforma API 19 Android". L'ho cambiato in "Android 4.2.2" che equivale a API 17 e il marker di errore rosso è svanito. L'API 17 è sufficiente per il mio progetto, quindi posso lasciarlo così. Non ho idea del perché questo risolva il problema, a dire il vero.


1

Ho trovato una soluzione per questo, almeno da parte mia. È sicuramente un bug di IntelliJ, ma sembra essere causato da un conflitto tra le classi nel sourcepath e nel percorso di classe per l'SDK di Android.

Se vai a Struttura del progetto> SDK> {{Your Android SDK}}, rimuovi qualsiasi voce Android dalla scheda Sourcepath. Il problema con questa soluzione alternativa è che non si ha più accesso diretto alle fonti da IntelliJ / Android Studio.

Ho pubblicato le stesse informazioni sul tracker dei problemi di Jetbrains , quindi speriamo di vedere presto una soluzione.


Adesso c'è una soluzione. Sarà probabilmente incluso in v0.9.3
pfmaggi il

1

Usa solo fragment.class.getSimpleName ();

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.