Search code examples
javagenericsjunithamcrest

Generic assertThat(ArrayList, hasItems(InstanceOfSomeInterface)) not working


i want to use Hamcrest’s hasItems with an "actual" collection that is an ArrayList<? extends SomeInterface> on

assertThat(ArrayList<? extends SomeInterface>, hasItems(InstanceOfSomeInterface))

the compiler says:

The method assertThat(T, Matcher<T>) in the type Assert is not applicable for the arguments (ArrayList<capture#9-of ? extends MyInterface>, Matcher<Iterable<MyInterface>>)

what is going wrong? What can i do about that (i really want to use Hamcrest here)?


Solution

  • ArrayList<SomeInterface> newList = new ArrayList<SomeInterface>();
    newList.addAll(origList);
    assertThat(newList, hasItems(InstanceOfSomeInterface));
    

    It is unfortunate that Assert.assertThat was not coded using ? super or ? extends to allow for what you describe.