gpt4 book ai didi

java - Hamcrest 匹配器的冲突重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:06:10 24 4
gpt4 key购买 nike

匹配器 IsIterableContainingInAnyOrder 有两个静态工厂方法重载 containsInAnyOrder (两者都有返回类型 Matcher<java.lang.Iterable<? extends T>> ):

  1. containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
  2. containsInAnyOrder(Matcher<? super T>... itemMatchers)

现在考虑下面的程序:

import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;

import java.util.Arrays;

import org.junit.Test;

public class SomeTest {

@SuppressWarnings("unchecked")
@Test
public void foo() {
assertThat(Arrays.asList("foo","bar"),
containsInAnyOrder(equalTo("foo"), equalTo("bar")));
}

}

将此作为 JUnit 测试执行时,它按预期通过了。它使用 containsInAnyOrder 的第二个重载如上所示。

现在,当我将断言更改为此(与 documentation of the first overload 中给出的示例完全匹配)时:

assertThat(Arrays.asList("foo","bar"), 
containsInAnyOrder(Arrays.asList(equalTo("foo"), equalTo("bar"))));
^^^^^^^^^^^^^^

它不再编译,因为现在编译器推断出 containsInAnyOrder 的返回类型成为

Matcher<Iterable<? extends List<Matcher<String>>>>

编译器似乎仍然选择了第二个重载。如果它使用第一个,则该示例应该有效。为什么它会这样?我怎样才能使它工作?

我正在使用 Hamcrest 1.3 和 Oracle Java 1.7。

最佳答案

它实际上匹配两个重载方法。我不确定为什么选择第一个,但您可以提供提示以使其选择正确的方法。

通过将参数转换为 Collection :

assertThat(Arrays.asList("foo","bar"),
containsInAnyOrder((Collection)Arrays.asList(equalTo("foo"), equalTo("bar"))));

或通过将通用类型 T 指定为 <String> (尽管不能使用静态导入):

assertThat(Arrays.asList("foo","bar"),
IsIterableContainingInAnyOrder.<String>containsInAnyOrder(Arrays.asList(equalTo("foo"), equalTo("bar"))));

关于java - Hamcrest 匹配器的冲突重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18614621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com