java – Hamcrest匹配器的冲突重载

前端之家收集整理的这篇文章主要介绍了java – Hamcrest匹配器的冲突重载前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
匹配器 IsIterableContainingInAnyOrder对静态工厂方法containsInAnyOrder有两个重载(两者都有返回类型Matcher< java.lang.Iterable<?extends T>>):

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

现在考虑以下程序:

  1. import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
  2. import static org.hamcrest.core.IsEqual.equalTo;
  3. import static org.junit.Assert.assertThat;
  4.  
  5. import java.util.Arrays;
  6.  
  7. import org.junit.Test;
  8.  
  9. public class SomeTest {
  10.  
  11. @SuppressWarnings("unchecked")
  12. @Test
  13. public void foo() {
  14. assertThat(Arrays.asList("foo","bar"),containsInAnyOrder(equalTo("foo"),equalTo("bar")));
  15. }
  16.  
  17. }

当它作为JUnit测试执行时,它会按预期传递.它使用上面显示的containsInAnyOrder的第二个重载.

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

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

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

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

似乎编译器仍然选择第二个重载.如果它使用第一个,示例应该有效.为什么它会像这样?我怎样才能做到这一点?

我使用的是Hamcrest 1.3和Oracle Java 1.7.

解决方法

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

通过将参数强制转换为Collection:

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

或者将泛型类型T指定为< String> (但不能使用静态导入):

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

猜你在找的Java相关文章