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

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

fragment.getClass().getSimpleName()

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

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

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

Ответ 1

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

Google разработала его в сотрудничестве с JetBrains. И такая же ошибка, как сообщается, происходит и в IntelliJ. Посмотрите Отчет об ошибке

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

((Object) this).getClass()

Ответ 2

Вместо изменения кода приложения вы можете избежать этой ошибки, исправив исходный код 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. открытый конечный родной класс getClass();

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

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

  • Вы можете прокомментировать всю декларацию getClass().
  • Вы можете добавить расширение, отличное от Java, к имени файла Object.java, например. Object.java.in.

Ответ 3

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

((Object) this).getClass()

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

((Object) fragment).getClass()

Ответ 4

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

Также связанная с этим проблема IntelliJ здесь.

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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