GetClass() в абстрактном классе дает неоднозначный вызов метода

У меня есть открытый абстрактный класс, и я пытаюсь использовать метод getClass(), так как мне понадобится информация из класса, расширяющего мой абстрактный класс. Пример:

public String getName() {
    return getClass().getSimpleName();
}

Однако IntelliJ сообщает об этом:

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

Код работает нормально, но с десятками предупреждений об ошибках в моей среде IDE на мой взгляд. Это нарушает мой рабочий поток с множеством ложных срабатываний.

Почему отображаются эти ошибки и что я могу сделать, чтобы их не видеть?

Ответ 1

Код в порядке, но это ошибка в IntelliJ.

Отчет об ошибке, другой.

Есть даже несколько отчетов об ошибках с различными вариантами этой проблемы. Как отмечал Даффимо в комментариях, это также связано с тем, что в пути к классам существуют разные версии JDK.

Ответ 2

Вызов моего getClass() вызова Object, как этот

((Object) this).getClass()

решает проблему (с не абстрактными классами) для меня. Это не здорово, но оно работает.

Кроме того, управление вашими SDK Android из настроек проекта и удаление всех JDK-банок из Android-SDK устраняет эту ошибку. Конечно, вам придется ссылаться на него в своем проекте, чтобы использовать исправление.

Ответ 3

Другим рабочим решением является создание вспомогательного метода для получения класса:

public Class<?> type() {
    return super.getClass();
}

или статического многоразового использования:

public static final Class<?> type(Object object) {
    return object.getClass();
}

Ответ 4

Я заметил, что это зависит от версии 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() выдает ошибку.

Ответ 5

Это может произойти, если у вас есть проект 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 долгое время назад.