我有一个方法返回一个自定义Map实现,其条目完全由非空键和值组成,所以我想添加类型注释,以指示客户端可以迭代Map.Entry而不必检查它们是否为null values:Map <@NonNull String,@ NonNull String>
问题是Map.get方法API指定为任何尝试检索Map中不存在的键的值返回null,并注释我的get方法实现以返回@Nullable String生成编译器警告然后返回类型与Map指定的@NonNull返回不兼容 .
我知道今天创建的Map.get API可能会返回java.util.Optional结果或抛出NoSuchElementException,但是,对现有的Collections API感兴趣,是否可以保持与get方法规范的兼容并指定我的 Map 只包含@NonNull值?
非常感谢 .
4 回答
不幸的是,Map API与null注释并不真正兼容 . Map.get返回泛型类型V,即使将V定义为@NonNull,也会违反API,因为null必须是允许的返回值 .
这是一个known limitation的空注释,可能只有在实现nullity profiles for libraries时才能解析 . 在此之前,唯一的解决方法是在获取值之前检查Map.containsKey而不是之后检查值为null,或者只是避免在 Map 值类型上使用@NonNull .
您似乎在指的是Eclipse的无效性检查实现 . 你是对的,它没有准确地说明对
Map.get
的调用 .如果对
Map.get
的调用的更精确推理对您很重要,您可能需要考虑使用不同的无效检查器 . 例如,构建在Checker Framework上的Nullness Checker处理您的案例 . 如果the key is in the map并且映射的所有元素都为非null,则将Map.get
的返回值视为非null .这是一个简单的库,可以用作解决方法:
以下是一些示例用法:
当您使用空值或键时出现此错误:
你解决了覆盖Serialize方法,如:
例如完整见这里:https://lentux-informatica.com/jackson-problema-con-maps-e-valori-null/