Hamcrest assertThat - 类型推断
Hamcrest assertThat - type inference
这是我的一个项目中所做工作的简化版本:
List<String> names = ...
assertThat(names, is(empty()));
这在我的 Eclipse 运行 和 Java 1.7.0.79
(以及 1.6.0.31
)上工作得很好。
但是在使用 Java 1.7.0.55
(和 1.6.0.29
)的远程系统上编译失败,错误消息如下:
no suitable method found for assertThat(java.util.List<String>,org.hamcrest.Matcher<java.util.Collection<java.lang.Object>>)
method org.hamcrest.MatcherAssert.<T>assertThat(T,org.hamcrest.Matcher<? super T>) is not applicable
(actual argument org.hamcrest.Matcher<java.util.Collection<java.lang.Object>> cannot be converted to org.hamcrest.Matcher<? super java.util.List<String>> by method invocation conversion)
method org.hamcrest.MatcherAssert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<? super T>) is not applicable
(cannot instantiate from arguments because actual and formal argument lists differ in length)
method org.hamcrest.MatcherAssert.assertThat(java.lang.String,boolean) is not applicable
(actual argument java.util.List<String> cannot be converted to java.lang.String by method invocation conversion)
我希望第一个重载变体符合我的情况,但这并不是因为看似有问题的类型推断。为什么编译器似乎认为实际参数是 org.hamcrest.Matcher<java.util.Collection<java.lang.Object>>
类型,而它显然应该是 org.hamcrest.Matcher<java.util.Collection<? extends java.lang.Object>>
知道 is
和 empty
方法的 signatures。
问题是我对 JDK 我可以在远程系统上切换到的内容的控制有限,这是一个产品。测试代码,我也不允许解决这个问题。 所以,目前我想做的只是了解问题是否是由于上述 JDKs 上的错误类型推断引起的。 诚然,我还没有我还没有在我的个人电脑上对上述 JDK 进行同样的尝试。
我使用 hamcrest 1.3 BTW。
在失败的系统上构建时似乎使用了 Hamcrest 1.2。当我使用 Hamcrest 1.2 构建您的代码时,它在使用 1.3 时失败并显示相同的错误消息。检查 Hamcrest 代码,Matchers.empty()
签名在 1.3 中已更改:
public static <E> org.hamcrest.Matcher<java.util.Collection<E>> empty() // 1.2
到
public static <E> org.hamcrest.Matcher<java.util.Collection<? extends E>> empty() // 1.3
这可以解释为什么它在 1.2 上失败但在 1.3 上有效。
您应该检查您的项目设置和无法确保构建时类路径上只有 hamcrest 1.3 的系统设置。
这是我的一个项目中所做工作的简化版本:
List<String> names = ...
assertThat(names, is(empty()));
这在我的 Eclipse 运行 和 Java 1.7.0.79
(以及 1.6.0.31
)上工作得很好。
但是在使用 Java 1.7.0.55
(和 1.6.0.29
)的远程系统上编译失败,错误消息如下:
no suitable method found for assertThat(java.util.List<String>,org.hamcrest.Matcher<java.util.Collection<java.lang.Object>>)
method org.hamcrest.MatcherAssert.<T>assertThat(T,org.hamcrest.Matcher<? super T>) is not applicable
(actual argument org.hamcrest.Matcher<java.util.Collection<java.lang.Object>> cannot be converted to org.hamcrest.Matcher<? super java.util.List<String>> by method invocation conversion)
method org.hamcrest.MatcherAssert.<T>assertThat(java.lang.String,T,org.hamcrest.Matcher<? super T>) is not applicable
(cannot instantiate from arguments because actual and formal argument lists differ in length)
method org.hamcrest.MatcherAssert.assertThat(java.lang.String,boolean) is not applicable
(actual argument java.util.List<String> cannot be converted to java.lang.String by method invocation conversion)
我希望第一个重载变体符合我的情况,但这并不是因为看似有问题的类型推断。为什么编译器似乎认为实际参数是 org.hamcrest.Matcher<java.util.Collection<java.lang.Object>>
类型,而它显然应该是 org.hamcrest.Matcher<java.util.Collection<? extends java.lang.Object>>
知道 is
和 empty
方法的 signatures。
问题是我对 JDK 我可以在远程系统上切换到的内容的控制有限,这是一个产品。测试代码,我也不允许解决这个问题。 所以,目前我想做的只是了解问题是否是由于上述 JDKs 上的错误类型推断引起的。 诚然,我还没有我还没有在我的个人电脑上对上述 JDK 进行同样的尝试。
我使用 hamcrest 1.3 BTW。
在失败的系统上构建时似乎使用了 Hamcrest 1.2。当我使用 Hamcrest 1.2 构建您的代码时,它在使用 1.3 时失败并显示相同的错误消息。检查 Hamcrest 代码,Matchers.empty()
签名在 1.3 中已更改:
public static <E> org.hamcrest.Matcher<java.util.Collection<E>> empty() // 1.2
到
public static <E> org.hamcrest.Matcher<java.util.Collection<? extends E>> empty() // 1.3
这可以解释为什么它在 1.2 上失败但在 1.3 上有效。
您应该检查您的项目设置和无法确保构建时类路径上只有 hamcrest 1.3 的系统设置。