IntelliJ и Eclipse расходятся во мнениях по поводу нулевых аннотаций через несколько интерфейсов. Является ли один «болеJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 IntelliJ и Eclipse расходятся во мнениях по поводу нулевых аннотаций через несколько интерфейсов. Является ли один «боле

Сообщение Anonymous »

У меня возникла проблема с нулевым анализом при компиляции GriefPrevention в Eclipse. Например, строка 304 в PlayerEventHandler.java вызывает Player#getLocation(). Спецификацию API для этого класса можно найти здесь.
Проблема в том, что этот класс наследуется как от интерфейсов Entity, так и от OfflinePlayer, которые имеют конфликтующие аннотации.
Для Entity getLocation() определяется как NonNull:

Код: Выделить всё

@NotNull
Location getLocation();
Но для OfflinePlayer он определен как Nullable:

Код: Выделить всё

/**
* Gets the player's current location.
*
* @return the player's location, {@code null} if player hasn't ever played
* before.
*/
@Nullable
public Location getLocation();
По моему мнению, в этой ситуации наименее разрешительная аннотация (Nullable) должна иметь приоритет. Однако IntelliJ с этим не согласен. Это создает проблему, поскольку я не могу скомпилировать этот код с помощью Eclipse, не отключив нулевые аннотации, что нежелательно, а разработчик, использующий IntelliJ, настаивает, что это не проблема (согласно его IDE).
Является ли интерпретация IntelliJ или Eclipse «более правильной» или результат неоднозначен, учитывая противоречивую аннотацию в спецификации API?
При тестировании такого рода неоднозначного наследования IntelliJ допускает @NotNull без каких-либо предупреждений или ошибок, но @Nullable выдает предупреждение:

Код: Выделить всё

import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

public class Main {
interface ITestNotNull {
@NotNull
Object ambiguous();
}

interface ITestNullable {
@Nullable
Object ambiguous();
}

static class ITest implements ITestNullable, ITestNotNull {
@Override
// Method annotated with @Nullable must not override @NotNull method
public @Nullable Object ambiguous() {
return new Object();
}
}

public static void main(String[] args) {
ITest a = new ITest();

System.out.println(a.ambiguous());
}
}
В Eclipse верно обратное, однако вместо этого я получаю ошибку компилятора:

Код: Выделить всё

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;

public class Main {
interface ITestNotNull {
@NonNull
Object ambiguous();
}

interface ITestNullable {
@Nullable
Object ambiguous();
}

static class ITest implements ITestNullable, ITestNotNull {
@Override
// The return type is incompatible with '@NonNull Object' returned from
// Main.ITestNotNull.ambiguous() (mismatching null constraints)
public @Nullable Object ambiguous() {
return new Object();
}
}

public static void main(String[] args) {
ITest a = new ITest();

System.out.println(a.ambiguous());
}
}
ОБНОВЛЕНИЕ
После дальнейшего рассмотрения и анализа проблемы выяснилось, что проблема, с которой я столкнулся, кажется ошибка в Eclipse. Реализация @NonNull в IntelliJ кажется правильной. Независимо от неоднозначности, он удовлетворяет обеим возможным реализациям.
https://github.com/eclipse-jdt/eclipse. ... ssues/2308

Подробнее здесь: https://stackoverflow.com/questions/782 ... terfaces-i
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему Linux Clang и macOS Clang расходятся во мнениях по поводу long long и int64_t?
    Anonymous » » в форуме Linux
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Почему Linux Clang и macOS Clang расходятся во мнениях по поводу long long и int64_t?
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Компиляторы расходятся во мнениях относительно типа статической функции-члена.
    Anonymous » » в форуме C++
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • GameObjects расходятся в разные стороны Unity
    Anonymous » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Можно ли вызвать методы по умолчанию интерфейсов аннотаций?
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»