1 回答
TA贡献1876条经验 获得超5个赞
这个问题可以在没有额外代码检查的情况下解决,只需使用@NotNull在其抽象方法上有注释的功能接口。
例如,如果您需要一个不能返回 null 的供应商,您可以使用此接口:
@FunctionalInterface
public interface NotNullSupplier<T> {
@NotNull
T get();
}
如果您尝试从这种类型的 lambda 表达式返回 null,Constant conditions & exceptions或Return of 'null' code inspection 将检测到它:
NotNullSupplier<Integer> supplier = () -> null; // warning - 'null' is returned by the method declared as @NotNull
我想注意使用Supplier<@NotNull T>可能会导致提到的代码检查的不正确行为(它一定是一个错误,可能会在以后修复)。这是此类行为的示例:
Supplier<@NonNull Integer> supplier = () -> null; // no warnings
Integer result = supplier.get();
if(result != null) // warning - Condition 'result != null' is always 'true'
result++;
常量条件和异常代码检查建议“展开‘if’语句”,在这种情况下遵循此建议将导致NullPointerException.
为避免此类错误,您可以将以下搜索模板添加到结构搜索检查中:
//Search template:
Supplier<@NotNull $T$>
//Replace template:
NotNullSupplier<$T$>
//Search template:
Function<$T$, @NotNull $R$>
//Replace template:
NotNullFunction<$T$, $R$>
//Search template:
BiFunction<$T$, $U$, @NotNull $R$>
//Replace template:
NotNullBiFunction<$T$, $U$, $R$>
添加回答
举报