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