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)
Konrad Morawski

2
Більше року пізніше, і досі це не встановлено :(
Кай

73

Замість того, щоб змінювати код програми, ви можете уникнути цієї помилки , виправляючи вихідний код Android SDK.

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

  • Зробіть текст, призначений для Object.javaзапису, вибравшиFile -> Make File Writable . Можливо, вам буде запропоновано зробити це автоматично, якщо ви спробуєте редагувати файл.
  • Видаліть необмежену підстановку:

    // Видалено необмежену підстановку (Class), щоб уникнути http://youtrack.jetbrains.com/issue/IDEA-72835 публічного остаточного рідного класу getClass ();

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

Ця зміна збереже функціональну функцію навігації джерела. Інші варіанти:

  • Ви можете прокоментувати всю getClass()декларацію.
  • Ви можете додати розширення, яке не є Java, до імені Object.javaфайлу, наприклад Object.java.in.

Джеймс Уолд, приємна відповідь, + 1
Ritesh Gune

2
Насправді я думаю, що це має бути прийнятою відповіддю.
Томас Келлер

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 (), ви кидаєте об'єкт, у якому ви зараз знаходитесь (це), щоб трактуватись як Об'єкт.
Хорхе Агілар

6
Можливо, це заслуговує на золоту медаль за найвідоміший спосіб вирішення, який коли-небудь вимагав Java IDE. Кастинг Java Object на Object, вражаюча вакуумність.
Snicolas

8

Перш за все, пов'язаний з цим питання Android Студія тут . Будь ласка, позначте це зіркою, щоб воно могло привернути увагу

Крім того , пов'язаний з цим питання IntelliJ знаходиться тут .

Хороший обхідний шлях для цього перейменувати <sdk>/android-<platform>/java/lang/Object.javaв Object.java.XXX, наприклад. Це не дасть AS бачити це, а проблему вдасться уникнути. Звичайно, зробивши це, ви більше не зможете легко переходити до джерела Об'єкта зсередини 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.