[英]How to make JUnit assertThat() work with lower bounded wildcard?
最初,我有這段生產代碼:
interface ActionSequence {
public List<Actions> getActions();
我測試了實現該接口的類,如下所示:
assertThat(sequenceUnderTest.getActions(), is(Arrays.asList(action1, action2));
然后我認為將生產界面更改為:
public List<? extends Action> getActions() {
(允許我返回Action的子類列表)。
但是現在eclipse告訴我:
The method assertThat(T, Matcher<? super T>) in the type Assert is not applicable for the arguments (List<capture#1-of ? extends Action>, Matcher<List<Action>>)
我想:當我改變實現ActionInterface的類時
@Override
public List<SomeSubClassOfAction> getActions()
(而不是保持通配符)...然后一切正常。 但為什么?
Arrays.asList(action1, action2)
將返回List<Action>
。 is(Arrays.asList(action1, action2))
將返回Matcher<List<Action>>
。
assert具有以下簽名:
assertThat(T actual, Matcher<T> matcher)
所以assertThat在你的情況下需要以下參數:
assertThat(List<Action>, Matcher<List<Action>>)
但是你的第一個參數是List<? extends Action>
List<? extends Action>
List<Action>
與List<? extends Action>
完全不同List<? extends Action>
List<? extends Action>
。 例如,您不能將Action元素放入List<SomeSubClassOfAction>
。 這就是為什么這不起作用的原因。
有關詳細信息,請參閱Angelika Langer的優秀網站: http : //www.angelikalanger.com/GenericsFAQ/FAQSections/Index.html
你的問題是,為什么
@Override
public List<SomeSubClassOfAction> getActions()
是一個合法的實施
public List<? extends Action> getActions()
答案是協變回報 。 由於允許Java1.5子類專門繼承返回的繼承方法。
但我不建議在返回參數中使用通配符類型,因為它不是客戶端友好的。 請參閱通用通配符類型不應用於返回參數及其來自Effective Java的引用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.