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


130

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

fragment.getClass().getSimpleName()

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

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

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



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

Ответы:


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.