Внешняя нулевая аннотация Eclipse для AbstractStreamEx.nonNull()

Рассмотрим следующий пример кода. Этот код использует Eclipse's @NonNull а также @Nullable аннотации для проверки nulls. К сожалению, Eclipse помечает ошибку на линии map(toNonNull),

import java.util.function.Function;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import one.util.streamex.StreamEx;

Function<@NonNull Integer, @Nullable Integer> toNull;
Function<@NonNull Integer, @NonNull Integer> toNonNull;

toNull    = value -> value;
toNonNull = value -> value;

StreamEx.
   of(1, 2, 3, 4, 5, 6).
   map(toNull).
   nonNull().
   map(toNonNull).   // Error is here
   count();

Вот сообщение об ошибке:

Несоответствие нулевого типа (аннотации типов): требуется 'Function', но это выражение имеет тип 'Function<@NonNull Integer, @NonNull Integer>'

Я хотел бы создать внешнюю аннотацию Eclipse на StreamExnonNull() (или, точнее, AbstractStreamEx's nonNull()) чтобы Eclipse знал, что значения в потоке не могут быть нулевыми.

Вот начало внешней аннотации Eclipse.

class one/util/streamex/AbstractStreamEx<TS>

nonNull
 ()TS;
 ()???;

Что я ставлю на ????

1 ответ

Решение

Для StreamEx 0.6.4 или новее StreamEx переопределяет nonNull() так что можно использовать следующую внешнюю аннотацию:

nonNull
 ()Lone/util/streamex/StreamEx<TT;>;
 ()L1one/util/streamex/StreamEx<T1T;>;

Для StreamEx 0.6.3 или более ранней версии одним из уродливых решений является изменение кода Java. Это работает вокруг ошибки компилятора.

StreamEx.
   of(1, 2, 3, 4, 5, 6).
   map(toNull).
   nonNull().
   map(item -> item != null ? toNonNull.apply(item) : null).
   count();
Другие вопросы по тегам