Android Studio - chamada de método ambígua getClass ()

130

Estou usando o Android Studio para meu aplicativo Android.
Meu código funciona e compila.
Recentemente, o IDE mostra um erro (linhas vermelhas) em getClass do seguinte código:

fragment.getClass().getSimpleName()

Mas ainda assim o aplicativo compila e executa.
O erro é:

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

Alguém pode me explicar sobre o que é? e por que o código ainda está em execução?

NickF
fonte
Eu recebo o mesmo erro, mas ainda posso montar e executar o aplicativo corretamente.
Jason Robinson

Respostas:

255

Eu acho que é um bug no Android Studio. Como sabemos, o Android Studio é baseado na plataforma IntelliJ e na funcionalidade existente do IntelliJ IDEA Community Edition.

O Google o desenvolveu em cooperação com o JetBrains. E o mesmo bug também ocorre no IntelliJ. Dê uma olhada no relatório de erro

A única solução alternativa para esse problema é transmitir a instância que você chama getClass(), da Objectseguinte maneira:

((Object) this).getClass()
Ritesh Gune
fonte
20
não importa agora ... tanto upvotes :)
Sam
1
@RiteshGune ver minha resposta abaixo
James Wald
11
modificar o código para solucionar um bug em um IDE não é uma solução.
Jeffrey Blattman
2
Ele não funciona, ou pelo menos não atualmente (Android Estúdio 0.8.9)
Konrad Morawski
2
Mais de um ano depois, e ele ainda não está corrigido :(
Kai
73

Em vez de modificar o código do aplicativo, você pode evitar esse bug corrigindo o código-fonte do SDK do Android.

Quando você encontrar o erro getClass (), vá para a declaração do método (⌘B no Mac). Isso irá navegar para um caminho como $ANDROID_HOME/sources/android-20/java/lang/Object.java. Agora, no IntelliJ ou no Android Studio:

  • Torne Object.javagravável escolhendo File -> Make File Writable. Você pode ser solicitado a fazer isso automaticamente se tentar editar o arquivo.
  • Remova o curinga ilimitado:

    // Removido o curinga ilimitado (Classe) para evitar http://youtrack.jetbrains.com/issue/IDEA-72835 Classe pública final nativa pública getClass ();

As versões mais recentes do Android Studio parecem sofrer de um erro que impede você de editar o arquivo, mesmo depois de declará-lo como gravável. Em vez disso, copie o caminho Edit -> Copy Pathou ⇧⌘C e edite-o no seu editor favorito.

Essa alteração preservará a funcionalidade de navegação de origem. Outras opções:

  • Você pode comentar a getClass()declaração inteira .
  • Você pode anexar uma extensão não Java ao nome do Object.javaarquivo, por exemplo Object.java.in.
James Wald
fonte
James Wald, boa resposta, + 1
Ritesh Gune
2
Na verdade, acho que essa deve ser a resposta aceita.
Thomas Keller
1
A resposta foi atualizada para refletir o fato de o Android Studio ter um bug que não permite Object.javaa edição mesmo após a limpeza do sinalizador somente leitura.
21413 James Wald
2
Aqui está o relatório de erro do Android Studio .
Phil
Só o comentário do método getClass faz com que o IntelliJ / Studio se queixe instance.getClass()( getClass()funciona apenas ). Renomear Object.javaarquivo para desativá-lo funciona.
Pierre-Luc Paour 26/09/14
9

Converta seu "getClass" em um Objeto, use

((Object) this).getClass()

Para aqueles que têm esse problema com fragmentos, use

((Object) fragment).getClass()
AnhSirk Dasarp
fonte
3
Na verdade, você não lança o resultado getClass (), o objeto no qual você está agora (este) a ser tratado como um objeto.
Jorge Aguilar
6
Provavelmente, isso merece uma medalha de ouro pela solução mais infame já exigida por um IDE Java. Lançando um Java Object to Object, vacuidade impressionante.
Snicolas
8

Primeiro, a questão relacionada ao Android Studio está aqui . Por favor, estrele para que ele possa receber alguma atenção!

Também a questão IntelliJ relacionada está aqui .

Uma boa solução para isso é renomear <sdk>/android-<platform>/java/lang/Object.javapara, Object.java.XXXpor exemplo. Isso impedirá que o AS o veja e o problema será evitado. Obviamente, ao fazer isso, você não poderá mais navegar facilmente para a origem do Object no AS.

Você pode renomear o arquivo de volta ao seu nome original quando esse bug for corrigido ...

BoD
fonte
2

Hoje, tive o mesmo problema quando criei um novo projeto. Comparei com outro projeto que não teve esse problema e encontrou uma diferença. O projeto antigo foi desenvolvido no "Android 4.2.2", enquanto o novo foi definido por padrão como "Android API 19 Platform". Alterei isso para "Android 4.2.2", que é igual à API 17 e o marcador de erro vermelho desapareceu. A API 17 é suficiente para o meu projeto, para que eu possa deixar assim. Não sei por que isso resolve o problema, para ser sincero.

Uwe Post
fonte
1

Encontrei uma solução para isso, pelo menos do meu lado. Definitivamente, é um bug do IntelliJ, mas parece ser causado por um conflito entre as classes no caminho de origem e no caminho de classe para o SDK do Android.

Se você for para Estrutura do projeto> SDKs> {{Your Android SDK}}, remova quaisquer entradas do Android da guia Caminho da origem. O problema com esta solução alternativa é que você não tem mais acesso direto às fontes no IntelliJ / Android Studio.

Publiquei as mesmas informações no rastreador de problemas do Jetbrains , então esperamos ver uma correção em breve.

Kevin Coppock
fonte
Agora há uma correção. Provavelmente será incluído na v0.9.3
pfmaggi
1

Basta usar fragment.class.getSimpleName ();

Sotti
fonte