簡體   English   中英

Hamcrest斷言 - 類型推斷

[英]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>>知道isempty方法的簽名

問題是我對可以在遠程系統上切換到的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM