如何在Java 7中编译包含(List <Matcher> itemMatchers)?

Ben*_*Ben 6 java hamcrest

我正在学习Hamcrest 1.3,我想在Matchers中为每个Hamcrest静态方法提供一个例子.Javadoc已经有了一些方法的例子.我测试了以下包含 Java 8的代码片段,它通过了:

assertThat(Arrays.asList("foo", "bar"), 
           contains(Arrays.asList(equalTo("foo"), equalTo("bar"))));
Run Code Online (Sandbox Code Playgroud)

但是,我的团队目前正在使用Java 7,所以我想确保所有示例都适用于该版本.上面的代码片段在Java 7中产生以下错误:

没有为assertThat找到合适的方法(java.util.List,org.hamcrest.Matcher >>>)方法org.junit.Assert.assertThat(T,org.hamcrest.Matcher)不适用(实际参数org.hamcrest.Matcher >>>无法转换为org.hamcrest.Matcher>通过方法调用转换)方法org.junit.Assert.assertThat(java.lang.String,T,org.hamcrest.Matcher)不适用(无法从参数实例化,因为实际和正式的参数列表长度不同)

我知道Java 8为静态方法添加了新的隐式类型功能,我认为这可能是相关的.我试图重构参数并将它们转换为预期的参数,但这会导致相同的错误:

List<String> actual = Arrays.asList("foo", "bar");
List<Matcher<String>> expected = Arrays.asList(equalTo("foo"), 
                                               equalTo("bar"));
assertThat(actual, contains(expected));
Run Code Online (Sandbox Code Playgroud)

static <E> Matcher<java.lang.Iterable<? extends E>> contains(java.util.List<Matcher<? super E>> itemMatchers)在Java 7中调用的正确方法是什么?

Mue*_*uel 10

在Hamcrest Javadoc中,contains()您要定位的方法签名是:

 public static <E> Matcher<Iterable<? extends E>> contains(List<Matcher<? super E>> itemMatchers);
Run Code Online (Sandbox Code Playgroud)

上面签名中要注意的重要一点是List<Matcher<? super E>>.Java 7无法推断List<Matcher<? super E>>出来List<Matcher<String>>.所述contains()附加过载,所以该方法的签名Java 7的目标是:

public static <E> Matcher<Iterable<? extends E>> contains(E... items);
Run Code Online (Sandbox Code Playgroud)

这就是你得到神秘编译错误信息的原因!

幸运的是,修复非常简单:

List<String> actual = Arrays.asList("foo", "bar");
List<Matcher<? super String>> expected = Arrays.<Matcher<? super String>>asList(equalTo("foo"), 
                                                                                equalTo("bar"));
assertThat(actual, contains(expected));
Run Code Online (Sandbox Code Playgroud)