usar resueltos interfaces importancia implementación ejercicios cual creacion clases clase abstractas abstracta java android intellij-idea

java - resueltos - implementación de clases abstractas



getClass() en la clase abstracta da una llamada al método ambiguo (5)

Tengo una clase abstracta pública e intento utilizar el método getClass() , ya que necesitaré información de la clase para extender mi clase abstracta. Un ejemplo es esto:

public String getName() { return getClass().getSimpleName(); }

Sin embargo, IntelliJ informa esto:

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

El código funciona bien, pero tener decenas de advertencias de error en mi IDE es un poco en mi camino. Interrumpe mi flujo de trabajo con muchos falsos positivos.

¿Por qué se muestran estos errores y qué puedo hacer para no verlos?



Esto puede suceder si tienes un proyecto de Android con Maven, e importas a IntelliJ usando la Maven Android Platform como el SDK del proyecto. El problema es que tanto Maven Android Platform como el paquete de dependencia maven de Android incluyen la clase java.lang.Object .

La solución alternativa es ir a Estructura del proyecto -> Configuración de plataforma -> SDK -> Maven plataforma Android -> Classpath . Enumerará todos los frascos que están en JDK en realidad. Elimínelos, de modo que solo queden dos dependencias de Android ( res y annotations.jar ).

EDITAR : Este problema ya se ha reported al rastreador de problemas de IntelliJ hace mucho tiempo.


Me di cuenta de que depende de la versión de Android a la que hace referencia si el error ocurre o no. Solía ​​definir una dependencia para Android 4.1.1.4 en el enlace pom.xml a Maven Central .

<dependency> <groupId>com.google.android</groupId> <artifactId>android</artifactId> <version>4.1.1.4</version> <scope>provided</scope> </dependency>

Mientras tanto, proporciono las dependencias necesarias usando maven-android-sdk-deployer .

<dependency> <groupId>android</groupId> <artifactId>android</artifactId> <version>4.3_r1</version> <scope>provided</scope> </dependency>

Entonces getClass() produce el error.


Otra solución de trabajo es generar un método de ayuda para obtener la clase:

public Class<?> type() { return super.getClass(); }

o una utilidad estática reutilizable:

public static final Class<?> type(Object object) { return object.getClass(); }


getClass() mi llamada getClass() a Object como este

((Object) this).getClass()

resuelve el problema (con clases no abstractas) para mí. No es genial, pero está funcionando.

Además, la manipulación de los SDK de Android desde la configuración del proyecto y la eliminación de todos los archivos JDK de su SDK de Android resuelve el error. Por supuesto, tendrá que hacer referencia a él dentro de su proyecto para utilizar la solución.