当前位置: 首页 > 知识库问答 >
问题:

泛型地狱:作为方法参数的hamcrest matcher

丰景同
2023-03-14

因此,让我们有一个字符串列表和一个函数,该函数接受一个Hamcrest匹配器,并返回所提供的匹配器的matches()方法的结果:

public boolean matchIt(final Matcher<? super List<String>> matcher) {
    final List<String> lst = obtainListFromSomewhere();
    return matcher.matches(lst);
}

到目前为止还好。现在我可以很容易地调用:

matchIt(empty());
matchIt(anything());
matchIt(hasItem("item"));
matchIt(everyItem(equalToIgnoringCase("item")));
matchIt(everyItem(anything()));
public boolean matchIt(final Matcher<? super List<? super String>> matcher);

但根本不管用。它不仅不接受everyitem(Anywhere()),甚至不接受以前正确的everyitem(EqualtoIngrowingCase(“Item”))say(1.7.0_05编译器版本):

actual argument Matcher<Iterable<String>> cannot be converted to Matcher<? super List<? super String>> by method invocation conversion

什么?那么这里怎么了?是matchit()方法签名还是everyitem()Hamcrest签名设计错误?或者仅仅是Java泛型系统无法修复?非常感谢您的评论!

EDIT@rLegendi我在这里的目的是为客户机添加和执行关于列表的谓词提供一个接口。这就是matchit()方法。调用matchit(anywhere())在这个场景中是有意义的,客户机希望知道列表是否是任何东西。调用matchit(empty())意味着客户机想知道列表是否为空。对于matchit(everyItem(EqualtoIngoringCase("Item“)))matchit(hasItem(”Item“))则相反。

但是,我找不到正确的签名,matchit(matcher<?super list<?super string>>)不适用于everyitem(notNullValue());

我使用的是Hamcrest 1.3。

编辑2:

我甚至不会做<编码>匹配器<?超级列表 >m1=M;。匹配器 不是匹配器<?超级列表<?>>?为什么?

共有2个答案

赫连华皓
2023-03-14
热门标签
裴实
2023-03-14
相关问题
 类似资料:
  • 问题内容: 我怀疑以前曾在这里问过(并回答过),但我不知道该如何命名。为什么仅当我不通过类本身时才可以毫无问题地表达通配符? 一切都归结为这段代码。一切正常,除了对的调用: 问题答案: 的类型是。当将其提供给时,编译器需要检查是否为的子类型,这将简化为是否为的子类型。子类型关系不成立,方法调用失败。 @Bohemian的解决方案也应如此。在此,子类型检查在推断出之后的边界检查时发生。它也应该失败。

  • 问题内容: 您认为可以创建类似的东西吗? 问题答案: 是的你可以。 用法示例:

  • 问题内容: 在C#中,我实际上可以这样做: 但是由于某种原因,我无法使其在Java中工作。 我要做的是在超类上创建一个静态方法,以便可以将子类转换为XML。 问题答案: 称为: 或更明确地: 更令人困惑的是,您可以拥有既构造泛型类型又具有泛型参数的构造函数。不记得该语法,也从未在愤怒中使用过它(无论如何,最好还是使用静态创建方法)。 强制转换是不安全的,并且您不能编写T.class。因此,将T.c

  • 问题内容: 问题摘要: 我想将具有类型参数(例如)的类作为类型参数传递给泛型方法。 假设我有一个方法: 当然,此方法对于任何类型的类都可以正常使用。我可以这样调用该方法,例如: 问题: 我发现我不能这样做: 从句法上讲,这显然是无效的。但是,我不确定如何实现这样的目标。我当然可以通过,但是泛型类型的添加使其在语法上不再有效,并且我想不出解决方法。 唯一的直接解决方案是这样的事情(看起来很愚蠢):

  • 问题总结:我想传递一个带有类型参数(如

  • 为什么<代码>列表 我不明白编译器的消息和编译错误的原因。 返回类型没有问题: