没有这样的方法错误:ImmutableList.copyOf()

2022-09-01 08:45:47

我正在使用Guava-05-snapshot,Sun的JDK 1.6代码在执行这个片段时爆炸了:

List<String> badpasswords = Lists.newArrayList( Password.badWords);
Collections.sort(badpasswords);
ImmutableList<String> tmp = ImmutableList.copyOf(badpasswords);

特别是在ImmutableList.copyOf()调用上。这个代码已经工作了几个月,使用旧的Google-Collections代码。

java.lang.NoSuchMethodError: com.google.common.collect.ImmutableList.copyOf(Ljava/util/Collection;)Lcom/google/common/collect/ImmutableList;

是可写数组的创建,排序完美地工作。但尝试将数组转换为失败。Password.badWordsImmutableSet<String>ImmutableList


答案 1

番石榴是Google Collections的完全兼容的超集 - 我们没有以不兼容的方式更改任何内容。(这是通过针对最新的番石榴罐运行整个Google Collections测试套件(非常广泛)来测试的。

我相信你有一个google-collect-*的副本,.jar仍然进入你的类路径。要么是显式的,要么是因为其他一些jar包含它而没有重新包装它。你只需要找到它并删除它。

在Google Collections中,有一种方法,并且没有公共方法。这很好,因为集合也是可迭代的。在番石榴中,我们添加了集合重载。这是完全兼容的,因为所有用于编译的源代码仍然可以,并且以前编译的任何源代码仍将引用原始方法。ImmutableList.copyOf(Iterable)ImmutableList.copyOf(Collection)

如果你针对番石榴进行编译,但随后又针对Google Collections运行,那么问题就来了。我相信这可能是正在发生的事情。


答案 2

对于使用Maven的官方(非快照)番石榴-r05版本的我来说,这也很好。顺便说一句,这可能是做同样的事情的更好方法:

ImmutableList<String> sorted = Ordering.natural()
    .immutableSortedCopy(Password.badWords);

推荐