3
集合在一個測試類使用AssertJ,我也有類似的代碼如下:泛型和通配符在Java
public void someTest() {
assertThat(getNames()).has(sameNamesAs(getExpectedNames()));
assertThat(getNames()).doesNotHave(sameNamesAs(getOtherNames()));
}
private List<String> getNames() {
return null;
}
private List<String> getExpectedNames() {
return null;
}
private List<String> getOtherNames() {
return null;
}
private Condition<List<String>> sameNamesAs(List<String> rhs) {
return new Condition<List<String>>("same names as " + rhs) {
@Override
public boolean matches(final List<String> lhs) {
return lhs.containsAll(rhs) && rhs.containsAll(lhs);
}
};
}
我上調用編譯錯誤has
和doesNotHave
:
has/doesNotHave
(org.assertj.core.api.Condition<? super java.util.List<? extends java.lang.String>>)
in AbstractListAssert cannot be applied
to
(org.assertj.core.api.Condition<java.util.List<java.lang.String>>).
我是新來的Java和我不明白的問題:java.util.List
是超級類型的java.util.List
和java.lang.String
延伸java.lang.String
,不是嗎?
謝謝你的解決方案和解釋。如果我理解正確,我的錯誤是相信'List'是一個超級類型的List <?擴展String>',而這兩個類型實際上沒有繼承關係。我只是不明白你的答案中的這一行:'//通過簽名,我們必須通過條件<?超級元素>或條件<?超實際>'。這裏的'ACTUAL'是什麼? –
@ChristopheFuzier,是的,因爲'列表'是* List *的一個子*。擴展String>'。 'ACTUAL','ELEMENT'分別是方法和'Assertions'類的不同泛型參數('ACTUAL = List <?extends ELEMENT>') –
Andrew