为什么 ImmutableCollection.contains(null) 失败?

Dán*_*gyi 6 java collections immutability

coll.contains(null)前面的问题:为什么在 Java 中对 ImmutableCollections 的调用会失败?

我知道,不可变集合不能包含空元素,我不想讨论这是好是坏。

但是,当我编写一个需要一个(一般的,非显式不可变的)集合的函数时,它在检查空值时失败。为什么实现不返回 false(这实际上是“正确”答案)?

Collection一般来说,我如何正确检查 a 中的空值?

编辑: 经过一些讨论(感谢评论者!)我意识到,我混淆了两件事:番石榴库中的ImmutableCollection和java.util.List.of返回的 List ,是 ImmutableCollections 中的某个类。然而,这两个类都会在 上抛出 NPE .contains(null)

我的问题在于List.of结果,但从技术上讲,番石榴实施也会发生同样的情况。[编辑:事实并非如此]

Kev*_*ion 14

看到这样的讨论我很心疼!

自从我写出第一个最终成为番石榴的集合之前,这样做的集合一直是我最讨厌的。如果您发现任何 Guava 集合仅仅因为您问了一个完全无辜的问题(例如 )而抛出 NPE .contains(null),请提交错误!我们讨厌那些废话。

编辑:我非常苦恼,以至于我不得不回去查看 2007 年首次创建 ImmutableSet 的变更列表,并看到了这样的内容:

  @Override public boolean contains(@Nullable Object target) {
    if (target == null) {
      return false;
    }
Run Code Online (Sandbox Code Playgroud)

啊啊啊。

  • 我放心了。但自从那条评论之后……我们找到了一个!`EvictingQueue` 一直在这样做。所以我们正在修复它。 (3认同)
  • @KevinBourillion 脑残。眼睛看到“return false;”,大脑解析“throw new NullPointerException”。大脑受到了应有的严厉谴责。 (2认同)