以下是我的一个项目所做工作的简化版本:
List<String> names = ...
assertThat(names, is(empty()));这在运行在Java1.7.0.79(和1.6.0.31)上的Eclipse上很好。
但是,在使用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>>,知道签名 of is和empty方法。
问题是,我对JDK在远程系统上可以切换到什么方面的控制有限,这是一个刺激。测试代码,我也不允许解决这个问题。因此,现在我要做的就是理解这个问题是否是由于对上述JDK的错误类型推断造成的。诚然,我还没有在我的个人计算机上尝试过相同的JDK。
我用的是hamcrest 1.3 BTW。
发布于 2016-01-07 21:08:57
在构建失败系统时,似乎使用了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在类路径上。
https://stackoverflow.com/questions/34664647
复制相似问题