Ответ 1
Код в порядке, но это ошибка в IntelliJ.
Есть даже несколько отчетов об ошибках с различными вариантами этой проблемы. Как отмечал Даффимо в комментариях, это также связано с тем, что в пути к классам существуют разные версии JDK.
У меня есть открытый абстрактный класс, и я пытаюсь использовать метод getClass()
, так как мне понадобится информация из класса, расширяющего мой абстрактный класс. Пример:
public String getName() {
return getClass().getSimpleName();
}
Однако IntelliJ сообщает об этом:
Ambiguous method call. Both
getClass () in Object and
getClass () in Object match.
Код работает нормально, но с десятками предупреждений об ошибках в моей среде IDE на мой взгляд. Это нарушает мой рабочий поток с множеством ложных срабатываний.
Почему отображаются эти ошибки и что я могу сделать, чтобы их не видеть?
Код в порядке, но это ошибка в IntelliJ.
Есть даже несколько отчетов об ошибках с различными вариантами этой проблемы. Как отмечал Даффимо в комментариях, это также связано с тем, что в пути к классам существуют разные версии JDK.
Вызов моего getClass()
вызова Object
, как этот
((Object) this).getClass()
решает проблему (с не абстрактными классами) для меня. Это не здорово, но оно работает.
Кроме того, управление вашими SDK Android из настроек проекта и удаление всех JDK-банок из Android-SDK устраняет эту ошибку. Конечно, вам придется ссылаться на него в своем проекте, чтобы использовать исправление.
Другим рабочим решением является создание вспомогательного метода для получения класса:
public Class<?> type() {
return super.getClass();
}
или статического многоразового использования:
public static final Class<?> type(Object object) {
return object.getClass();
}
Я заметил, что это зависит от версии Android, на которую вы ссылаетесь, возникает ли ошибка или нет. Я использовал определение Android 4.1.1.4 в pom.xml
, ссылаясь на Maven Central.
<dependency>
<groupId>com.google.android</groupId>
<artifactId>android</artifactId>
<version>4.1.1.4</version>
<scope>provided</scope>
</dependency>
Между тем, я предоставляю необходимые зависимости, используя maven-android-sdk-deployer.
<dependency>
<groupId>android</groupId>
<artifactId>android</artifactId>
<version>4.3_r1</version>
<scope>provided</scope>
</dependency>
Затем getClass()
выдает ошибку.
Это может произойти, если у вас есть проект Android с Maven, и вы импортируете его в IntelliJ, используя Maven Android Platform
в качестве SDK проекта. Проблема заключается в том, что как Maven Android Platform
, так и java-зависимый баннер Android maven включают класс java.lang.Object
.
Обходной путь goint для структуры проекта → Настройки платформы → SDK → Платформа Android Maven → Classpath. В нем будут перечислены все банки, которые находятся в JDK. Удалите все из них, поэтому остаются только две зависимости от Android (res
и annotations.jar
).
EDIT: эта проблема уже была сообщена в Tracker IntelliJ долгое время назад.