作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
匹配器 IsIterableContainingInAnyOrder
有两个静态工厂方法重载 containsInAnyOrder
(两者都有返回类型 Matcher<java.lang.Iterable<? extends T>>
):
containsInAnyOrder(java.util.Collection<Matcher<? super T>> itemMatchers)
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/
我是一名优秀的程序员,十分优秀!