Использование Eclipse 2019-12.
Я определяю такой метод:
public static <T> T execute(@NonNull Supplier<T> action) {
return action.get();
}
Теперь, если я сделаю это:
public @NonNull String foo() { return ""; }
public String doSomething() {
return MyClass.execute(() -> foo());
}
Eclipse показывает информационное / предупреждающее сообщение в doSomething
теле, говорящее:
Unsafe interpretation of method return type as '@NonNull' based on substitution 'T=@NonNull String'. Declaring type 'MyClass' doesn't seem to be designed with null type annotations in mind
Итак, я могу понять, что имея MyClass.execute(Supplier)
, возвращая T
и передавая Supplier<T>
, где T
это @NonNull
не обязательно означает, что возвращаемый тип также @NonNull
, потому что в целом MyClass.execute(Supplier)
может быть реализовано следующим образом:
public static <T> T execute(Supplier<T> action) {
if(action.getClass().getSimpleName().startsWith("a"))
return null;
return action.get();
}
в этом случае, даже если указанное Supplier
s T
переменная типа @NonNull
, MyClass.execute(Supplier)
по-прежнему возвращает null
в некоторых случаях (и Map.get(Object)
является конкретным примером, где он может вернуть null
, если указанный ключ отсутствует, даже если Map
равен определен как имеющий тип значения @NonNull
).
Но теперь, поскольку MyClass.execute(Supplier)
находится под моим контролем, я хотел бы понять, есть ли способ записать его в express без двусмысленностей, которые он возвращает type не является нулевым, если указанный Supplier
имеет возвращаемое значение @NonNull
, в то время как он допускает значение NULL, если указанный Supplier
имеет @Nullable
возвращаемое значение.
Кроме того, мне не ясно, почему это НЕ генерирует указанную выше информацию / предупреждение:
public String doSomething() {
return MyClass.execute(() -> "");
}
то есть я просто встроил метод foo()
позвоните в приведенном выше примере.