Android Studio - неоднозначный вызов метода getClass ()

130

Я использую Android Studio для своего Android-приложения.
Мой код работает и компилируется.
Недавно среда IDE выявила мне ошибку (красные линии) в getClass следующего кода:

fragment.getClass().getSimpleName()

Но все же приложение компилируется и запускается.
Ошибка:

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

Кто-нибудь может мне объяснить, о чем это? и почему код все еще работает?

NickF
источник
1
возможный дубликат getClass () в абстрактном классе дает
неоднозначный
Я получаю ту же ошибку, но все еще могу собрать и запустить приложение.
Джейсон Робинсон

Ответы:

255

Я думаю, что это ошибка в Android Studio. Как мы знаем, Android Studio основана на платформе IntelliJ и существующей функциональности IntelliJ IDEA Community Edition.

Google разработал его в сотрудничестве с JetBrains. Сообщается, что такая же ошибка возникает и в IntelliJ. Взгляните на отчет об ошибках

Единственный способ решения этой проблемы - привести экземпляр, который вы вызываете getClass(), к Objectследующему:

((Object) this).getClass()
Ритеш Гуне
источник
20
теперь не имеет значения ... ТАК МНОГО голосов :)
Сэм
1
@RiteshGune см. Мой ответ ниже
Джеймс Уолд
11
изменение кода для обхода ошибки в IDE - не самое лучшее решение.
Джеффри Блаттман
2
Это не работает или, по крайней мере, в настоящее время (Android Studio 0.8.9)
Конрад Моравски
2
Прошло больше года, а это до сих пор не исправлено :(
Kai
73

Вместо того, чтобы изменять код приложения, вы можете избежать этой ошибки , исправив исходный код Android SDK.

Когда вы столкнетесь с ошибкой getClass (), перейдите к объявлению метода (⌘B на Mac). Это приведет к переходу по пути, например $ANDROID_HOME/sources/android-20/java/lang/Object.java. Теперь в IntelliJ или Android Studio:

  • Сделайте Object.javaдоступным для записи по выбору File -> Make File Writable. Вам может быть предложено сделать это автоматически, если вы попытаетесь отредактировать файл.
  • Удалите неограниченный подстановочный знак:

    // Удален неограниченный подстановочный знак (класс), чтобы избежать http://youtrack.jetbrains.com/issue/IDEA-72835 общедоступного final native Class getClass ();

В более новых версиях Android Studio обнаружена ошибка, из-за которой вы не можете редактировать файл даже после объявления его доступным для записи. Вместо этого скопируйте путь Edit -> Copy Pathили ⇧⌘C и отредактируйте его в своем любимом редакторе.

Это изменение сохранит функциональность навигации по исходному тексту. Другие варианты:

  • Вы можете прокомментировать всю getClass()декларацию.
  • Вы можете добавить к имени Object.javaфайла расширение, отличное от Java , например Object.java.in.
Джеймс Уолд
источник
Джеймс Уолд, хороший ответ, +1
Ритеш Гюн
2
На самом деле я думаю, что это должен быть принятый ответ.
Thomas Keller
1
Обновлен ответ, чтобы отразить тот факт, что в Android Studio есть ошибка, которая не позволяет Object.javaредактировать даже после очистки флага только для чтения.
Джеймс Уолд
2
Вот это Android - студия отчет об ошибке.
Фил
Только комментирование метода getClass заставляет IntelliJ / Studio жаловаться instance.getClass()(только getClass()работает). Переименование Object.javaфайла для его отключения работает.
Пьер-Люк Паур
9

Передайте свой "getClass" объекту, используйте

((Object) this).getClass()

Для тех, у кого проблема с фрагментами, используйте

((Object) fragment).getClass()
АнхСирк Дасарп
источник
3
На самом деле, вы не приводите результат getClass (), вы приводите объект, в котором вы сейчас находитесь (this), чтобы его рассматривали как объект.
Хорхе Агилар
6
Это, вероятно, заслуживает золотой медали за самый печально известный обходной путь, который когда-либо требовался Java IDE. Преобразование объекта Java в объект, впечатляющая пустота.
Snicolas
8

Прежде всего, здесь есть проблема, связанная с Android Studio . Пометьте его звездочкой, чтобы привлечь внимание!

Также здесь есть проблема с IntelliJ .

Хорошим обходным решением для этого является, например, переименование <sdk>/android-<platform>/java/lang/Object.javaв Object.java.XXX. Это не позволит AS его увидеть, и проблема будет устранена. Конечно, сделав это, вы больше не сможете легко перейти к источнику Object из AS.

Вы можете переименовать файл обратно в его исходное имя, когда эта ошибка будет исправлена ​​...

Совет директоров
источник
2

Сегодня я столкнулся с той же проблемой при создании нового проекта. Я сравнил с другим проектом, в котором не было этой проблемы, и обнаружил одно отличие. Старый проект был построен на «Android 4.2.2», в то время как новый по умолчанию был настроен на «Android API 19 Platform». Я изменил это на «Android 4.2.2», что соответствует API 17, и красный маркер ошибки исчез. Для моего проекта достаточно API 17, так что я могу оставить его как есть. Честно говоря, я понятия не имею, почему это решает проблему.

Уве Пост
источник
1

Я нашел исправление для этого, по крайней мере, со своей стороны. Это определенно ошибка IntelliJ, но, похоже, она вызвана конфликтом между классами в пути к исходному тексту и в пути к классам для Android SDK.

Если вы перейдете в Структура проекта> SDK> {{Ваш Android SDK}}, удалите все записи Android на вкладке Sourcepath. Проблема с этим обходным путем заключается в том, что у вас больше нет прямого доступа к источникам из IntelliJ / Android Studio.

Я разместил ту же информацию о системе отслеживания проблем Jetbrains , так что, надеюсь, мы скоро увидим исправление.

Кевин Коппок
источник
Теперь есть исправление. Вероятно, он будет включен в v0.9.3
pfmaggi
1

Просто используйте fragment.class.getSimpleName ();

Sotti
источник