Android Studio - Appel de méthode ambigu getClass ()


130

J'utilise Android Studio pour mon application Android.
Mon code fonctionne et se compile.
Récemment, l'EDI me montre une erreur (lignes rouges) sur getClass du code suivant:

fragment.getClass().getSimpleName()

Mais l'application se compile et s'exécute toujours.
L'erreur est:

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

Quelqu'un peut-il m'expliquer de quoi il s'agit? et pourquoi le code est toujours en cours d'exécution?



J'obtiens la même erreur, mais je peux toujours assembler et exécuter l'application correctement.
Jason Robinson

Réponses:


255

Je pense que c'est un bogue dans Android Studio. Comme nous le savons, Android Studio est basé sur la plateforme IntelliJ et les fonctionnalités existantes d'IntelliJ IDEA Community Edition.

Google l'a développé en coopération avec JetBrains. Et le même bogue se produirait également dans IntelliJ. Jetez un œil au rapport d'erreur

La seule solution à ce problème est de lancer l'instance que vous appelez getClass()le, à la Objectmanière suivante:

((Object) this).getClass()

20
n'a pas d'importance maintenant ... SO MUCH UPVOTES :)
Sam

1
@RiteshGune voir ma réponse ci
James Wald

11
modifier le code pour contourner un bogue dans un IDE n'est pas vraiment une solution.
Jeffrey Blattman

2
Cela ne fonctionne pas, ou du moins pas actuellement (Android Studio 0.8.9)
Konrad Morawski

2
Plus d'un an plus tard et ce n'est toujours pas réglé :(
Kai

73

Plutôt que de modifier le code de votre application, vous pouvez éviter ce bogue en corrigeant le code source de votre SDK Android.

Lorsque vous rencontrez l'erreur getClass (), accédez à la déclaration de la méthode (⌘B sur Mac). Cela permettra d'accéder à un chemin tel que $ANDROID_HOME/sources/android-20/java/lang/Object.java. Maintenant, dans IntelliJ ou Android Studio:

  • Rendre Object.javaaccessible en écriture en choisissant File -> Make File Writable. Vous pouvez être invité à le faire automatiquement si vous essayez de modifier le fichier.
  • Supprimez le caractère générique illimité:

    // Suppression du caractère générique illimité (Classe) pour éviter http://youtrack.jetbrains.com/issue/IDEA-72835 public final native Class getClass ();

Les nouvelles versions d'Android Studio semblent souffrir d'un bogue qui vous empêche de modifier le fichier même après l'avoir déclaré inscriptible. Au lieu de cela, copiez le chemin, Edit -> Copy Pathou ⇧⌘C, et modifiez-le dans votre éditeur préféré.

Cette modification conservera la fonctionnalité de navigation source. Autres options:

  • Vous pouvez commenter toute la getClass()déclaration.
  • Vous pouvez ajouter une extension non Java au nom du Object.javafichier, par exemple Object.java.in.

James Wald, belle réponse, + 1
Ritesh Gune

2
En fait, je pense que cela devrait être la réponse acceptée.
Thomas Keller

1
Mise à jour de la réponse pour refléter le fait qu'Android Studio a un bogue qui ne permet pas Object.javad'être modifié même après avoir effacé l'indicateur en lecture seule.
James Wald

2
Voici le rapport de bogue d' Android Studio .
Phil

Seul le fait de commenter la méthode getClass amène IntelliJ / Studio à se plaindre instance.getClass()( getClass()fonctionne uniquement ). Renommer le Object.javafichier pour le désactiver fonctionne.
Pierre-Luc Paour

9

Diffusez votre "getClass" sur un objet, utilisez

((Object) this).getClass()

Pour ceux qui ont ce problème avec les fragments, utilisez

((Object) fragment).getClass()

3
En fait, vous ne transtypez pas le résultat getClass (), vous transtypez l'objet dans lequel vous vous trouvez en ce moment (this) pour qu'il soit traité comme un Object.
Jorge Aguilar

6
Cela mérite probablement une médaille d'or pour la solution de contournement la plus infâme jamais requise par un IDE Java. Conversion d'un objet Java en objet, une vacuité impressionnante.
Snicolas le

8

Tout d'abord, le problème associé à Android Studio est ici . Veuillez le mettre en étoile pour qu'il puisse attirer l'attention!

Le problème IntelliJ connexe est également ici .

Une bonne solution consiste à renommer <sdk>/android-<platform>/java/lang/Object.javaà Object.java.XXXpar exemple. Cela empêchera AS de le voir et le problème sera évité. Bien sûr, en faisant cela, vous ne pouvez plus facilement accéder à la source d'Object depuis AS.

Vous pouvez renommer le fichier à son nom d'origine lorsque ce bogue sera corrigé ...


2

Aujourd'hui, j'ai rencontré le même problème lorsque j'ai créé un nouveau projet. J'ai comparé à un autre projet qui n'avait pas ce problème et j'ai trouvé une différence. L'ancien projet était basé sur "Android 4.2.2" tandis que le nouveau était défini par défaut sur "Android API 19 Platform". J'ai changé cela en "Android 4.2.2" qui équivaut à l'API 17 et le marqueur d'erreur rouge a disparu. L'API 17 est suffisante pour mon projet donc je peux le laisser ainsi. Je n'ai aucune idée de pourquoi cela résout le problème, pour être honnête.


1

J'ai trouvé une solution à cela, du moins de mon côté. C'est certainement un bogue IntelliJ, mais il semble être causé par un conflit entre les classes dans le chemin source et dans le chemin de classe pour le SDK Android.

Si vous accédez à Structure du projet> SDK> {{Votre SDK Android}}, supprimez toutes les entrées Android de l'onglet Chemin source. Le problème avec cette solution de contournement est que vous n'avez plus d'accès direct aux sources à partir d'IntelliJ / Android Studio.

J'ai publié les mêmes informations sur le suivi des problèmes Jetbrains , donc j'espère que nous verrons bientôt un correctif.


Il y a maintenant une solution. Il sera probablement inclus dans la v0.9.3
pfmaggi

1

Utilisez simplement fragment.class.getSimpleName ();

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.