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?



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()

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, 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()

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 ...


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.


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.


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

1

Basta usar fragment.class.getSimpleName ();

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.