【发布时间】:2013-09-04 13:02:23
【问题描述】:
匹配器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。
【问题讨论】:
标签: java overloading hamcrest