簡體   English   中英

如何使JUnit assertThat()與較低的有界通配符一起工作?

[英]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.

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