Я пытаюсь внедрить сопоставители Hamcrest в код моей команды. Чтобы упростить сопоставление коллекции экземпляров, я хочу написать вспомогательный метод для каждого из моих сопоставителей, которые, как я ожидаю, будут желательны для сопоставления коллекций. Так что, по сути, я оборачиваю containsInAnyOrder. При этом, если кто-то передает значение null как ожидаемое и фактическое, я хочу, чтобы оно совпадало. Но так, как я написал свой код, он выдаст исключение NullPointerException, если для ожидаемого будет передано значение null. Итак, я хочу вернуть сопоставитель IsNull, если null передан как и ожидалось. Вот мой пример кода:
/**
* Matches all Foo objects in an order agnostic manner.
* @param expected The collection of Foo objects to be matched.
* @return A matcher that will match a collection of Foos
*/
@SuppressWarnings("unchecked")
public static Matcher<Iterable<? extends Foo>> matchesAllfoos(Collection<Foo> expected)
{
if (expected == null)
{
// Doesn't work because Matcher<Iterable> is not a Matcher<Iterable<? extends Foo>>
return nullValue(Iterable.class);
}
// The cast is here to provide a hint to Java as to which overloaded method to choose.
// See http://stackoverflow.com/questions/18614621/conflicting-overloads-for-hamcrest-matcher
return containsInAnyOrder((Collection)Collections2.transform(expected, FOO_TO_MATCHER));
}
Итак, как мне добиться того, что я хочу сделать? Использование nullValue() не работает, потому что тогда ожидается, что я верну Matcher. Кастинг nullValue(Iterable.class) не работает. Есть идеи?