![](/img/trans.png)
[英]How to use hamcrest nullValue with type inference in assertThat
[英]Hamcrest assertThat - type inference
這是我的一個項目中正在完成的簡化版本:
List<String> names = ...
assertThat(names, is(empty()));
這在我在Java 1.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>>
org.hamcrest.Matcher<java.util.Collection<? extends java.lang.Object>>
知道is
和empty
方法的簽名 。
問題是我對可以在遠程系統上切換到的JDK的控制有限,這是一個刺激。 測試代碼,我也不允許解決這個問題。 所以,目前我正在嘗試做的只是了解問題是否是由於對所述JDK的錯誤類型推斷造成的。 不可否認,我還沒有在我的個人計算機上對所述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在類路徑上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.