Android Studio: llamada a método ambiguo getClass ()

130

Estoy usando Android Studio para mi aplicación de Android.
Mi código funciona y compila.
Recientemente, el IDE me muestra un error (líneas rojas) en getClass del siguiente código:

fragment.getClass().getSimpleName()

Pero aún así la aplicación se compila y se ejecuta.
El error es:

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

¿Alguien puede explicarme de qué se trata? ¿Y por qué el código sigue ejecutándose?

NickF
fuente
Me sale el mismo error, pero todavía puedo armar y ejecutar la aplicación bien.
Jason Robinson

Respuestas:

255

Creo que es un error en Android Studio. Como sabemos, Android Studio se basa en la plataforma IntelliJ y la funcionalidad existente de IntelliJ IDEA Community Edition.

Google lo ha desarrollado en cooperación con JetBrains. Y se informa que el mismo error también ocurre en IntelliJ. Echa un vistazo al informe de errores

La única solución a este problema es emitir la instancia a la que llama getClass(), de la Objectsiguiente manera:

((Object) this).getClass()
Ritesh Gune
fuente
20
no importa ahora ... TANTO VOTOS :)
Sam
1
@RiteshGune vea mi respuesta a continuación
James Wald,
11
modificar el código para evitar un error en un IDE no es una gran solución.
Jeffrey Blattman
2
No funciona, o al menos no actualmente (Android Studio 0.8.9)
Konrad Morawski
2
Más de un año después y aún no se ha solucionado :(
Kai
73

En lugar de modificar el código de su aplicación, puede evitar este error parcheando el código fuente de su SDK de Android.

Cuando encuentre el error getClass (), vaya a la declaración del método (⌘B en Mac). Esto navegará a una ruta como $ANDROID_HOME/sources/android-20/java/lang/Object.java. Ahora, dentro de IntelliJ o Android Studio:

  • Haga Object.javaescribible eligiendo File -> Make File Writable. Es posible que se le solicite que haga esto automáticamente si intenta editar el archivo.
  • Elimine el comodín ilimitado:

    // Se eliminó el comodín ilimitado (Clase) para evitar http://youtrack.jetbrains.com/issue/IDEA-72835 public final native Class getClass ();

Las versiones más recientes de Android Studio parecen sufrir un error que le impide editar el archivo incluso después de declararlo como editable. En su lugar, copie la ruta Edit -> Copy Patho ⇧⌘C y edítela en su editor favorito.

Este cambio preservará la funcionalidad de navegación de origen. Otras opciones:

  • Puede comentar la getClass()declaración completa .
  • Puede agregar una extensión que no sea Java al nombre del Object.javaarchivo, por ejemplo Object.java.in.
James Wald
fuente
James Wald, buena respuesta, + 1
Ritesh Gune
2
En realidad, creo que esta debería ser la respuesta aceptada.
Thomas Keller
1
Se actualizó la respuesta para reflejar el hecho de que Android Studio tiene un error que no permite Object.javaser editado incluso después de borrar la marca de solo lectura.
James Wald
2
Aquí está el informe de errores de Android Studio .
Phil
Solo comentar el método getClass hace que IntelliJ / Studio se queje instance.getClass()(solo getClass()funciona). Cambiar Object.javael nombre del archivo para deshabilitarlo funciona.
Pierre-Luc Paour
9

Transmita su "getClass" a un Objeto, use

((Object) this).getClass()

Para aquellos que tienen este problema con fragmentos, use

((Object) fragment).getClass()
AnhSirk Dasarp
fuente
3
En realidad, no echas el resultado de getClass (), echas el objeto en el que estás ahora (esto) para ser tratado como un Objeto.
Jorge Aguilar
66
Probablemente esto merezca una medalla de oro por la solución más infame jamás requerida por un IDE de Java. Lanzar un objeto Java a un objeto, un vacío impresionante.
Snicolas
8

En primer lugar, el problema relacionado con Android Studio está aquí . ¡Marque con una estrella para que pueda llamar la atención!

También el problema relacionado con IntelliJ está aquí .

Una buena solución para esto es cambiar el nombre <sdk>/android-<platform>/java/lang/Object.javaa, Object.java.XXXpor ejemplo. Esto evitará que AS lo vea y se evitará el problema. Por supuesto, al hacer esto, ya no puede navegar fácilmente a la fuente del Objeto desde AS.

Puede cambiar el nombre del archivo a su nombre original cuando se solucione este error ...

BoD
fuente
2

Hoy me encontré con el mismo problema cuando creé un nuevo proyecto. Comparé con otro proyecto que no tenía este problema y encontré una diferencia. El antiguo proyecto se creó con "Android 4.2.2", mientras que el nuevo se configuró de forma predeterminada en "Plataforma Android API 19". Cambié eso a "Android 4.2.2" que equivale a API 17 y el marcador de error rojo desapareció. API 17 es suficiente para mi proyecto, así que puedo dejarlo de esta manera. No tengo idea de por qué esto resuelve el problema, para ser honesto.

Uwe Post
fuente
1

Encontré una solución para esto, al menos por mi parte. Definitivamente es un error de IntelliJ, pero parece ser causado por un conflicto entre las clases en sourcepath y classpath para el SDK de Android.

Si va a Estructura del proyecto> SDK> {{Su SDK de Android}}, elimine las entradas de Android de la pestaña Sourcepath. El problema con esta solución es que ya no tiene acceso directo a las fuentes desde IntelliJ / Android Studio.

He publicado la misma información en el rastreador de problemas de Jetbrains , así que espero ver una solución pronto.

Kevin Coppock
fuente
Ahora hay una solución. Probablemente se incluirá en v0.9.3
pfmaggi
1

Simplemente use fragment.class.getSimpleName ();

Sotti
fuente