【问题标题】:Compilation error using Hamcrest everyItem()使用 Hamcrest everyItem() 的编译错误
【发布时间】:2015-12-09 01:46:07
【问题描述】:

我正在尝试在 Hamcrest 的 everyItem() 上使用 hasKey(),但出现以下编译错误:

error: no suitable method found for assertThat(List<Map<String,Object>>,Matcher<Iterable<Map<? extends String,?>>>)
        assertThat(data, everyItem(hasKey("index")));
        ^
    method Assert.<T#1>assertThat(T#1,Matcher<? super T#1>) is not applicable
      (actual argument Matcher<Iterable<Map<? extends String,?>>> cannot be converted to Matcher<? super List<Map<String,Object>>> by method invocation conversion)
    method Assert.<T#2>assertThat(String,T#2,Matcher<? super T#2>) is not applicable
      (cannot instantiate from arguments because actual and formal argument lists differ in length)
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>assertThat(T#1,Matcher<? super T#1>)
    T#2 extends Object declared in method <T#2>assertThat(String,T#2,Matcher<? super T#2>)
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error

这是一个简单的 JUnit 测试,它重新创建了错误:

package test;

import org.junit.Test;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static org.hamcrest.collection.IsMapContaining.hasKey;
import static org.hamcrest.core.Every.everyItem;
import static org.junit.Assert.assertThat;

public class Test {

    @Test
    public void test(){
        List<Map<String, Object>> data = new ArrayList<>();
        Map<String,Object> element = new HashMap<>();
        element.put("index", 1);
        data.add(element);

        assertThat(data, everyItem(hasKey("index")));
    }



}
  • Java 1.7
  • Hamcrest 1.3
  • JUnit 4.11

有谁知道如何解决这个编译错误?

【问题讨论】:

  • 请也列出您的导入语句。
  • (手头没有环境)为data 添加演员表有效吗?即assertThat((Iterable&lt;Map&lt;String,Object&gt;&gt;)data, everyItem(hasKey("index")));

标签: java generics junit hamcrest


【解决方案1】:

这是一个嵌套泛型的例子。

data 当前声明为List&lt;Map&lt;String, Object&gt;&gt;,而everyItem(hasKey("index")) 被推断为返回Matcher&lt;Iterable&lt;Map&lt;? extends String, ?&gt;&gt;&gt;

如编译错误消息所述

Assert 类型中的方法assertThat(T, Matcher&lt;? super T&gt;) 不是 适用于参数 (List<Map<String,Object>>, Matcher<Iterable<Map<? extends String,?>>>)

这归结为hasKey 的返回类型为Map&lt;? extends T, ? 而不是Map&lt;T, ?&gt;,但这可能是有充分理由的。

幸运的是,您的代码很简单,您可以将data 声明为

List<Map<? extends String, ?>> data = new ArrayList<>();

并编译代码。

【讨论】:

  • 我试过你的代码行替换了提问者测试代码的第一行。它没有为我编译。
  • @Jazzepi 在带有 Java 7 的 Eclipse 和 ideone 中对我来说效果很好。
  • 谢谢,这行得通。编译信息很清楚,我只是在寻找括号和尖括号的正确组合以使其编译时遇到问题;没有考虑对我的已知类型较少具体。
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2016-08-23
相关资源
最近更新 更多