Дженерики ада: совпадение подколенного сухожилия как параметр метода

Так что давайте's имеют список строк и функцию, которая принимает совпадение Hamcrest и возвращает результатmatches() Метод предоставленного сопоставления:

public boolean matchIt(final Matcher matcher) {
    final List lst = obtainListFromSomewhere();
    return matcher.matches(lst);
}

Все идет нормально. Теперь я могу легко позвонить:

matchIt(empty());
matchIt(anything());
matchIt(hasItem("item"));
matchIt(everyItem(equalToIgnoringCase("item")));

... поскольку все эти фабричные статические методы производят сопоставление, которое соответствует сигнатуре метода.Matcher

Тем не менее, я считаю, что сопоставитель, который принимает Iterable объектов, должен быть принятmatchIt() метод также:

matchIt(everyItem(anything()));

Поэтому я наивно изменилmatchIt() подпись метода:

public boolean matchIt(final Matcher matcher);

Но это нене работает вообще. Не только это непринятьeveryItem(anything())это недаже принять ранее правильноеeveryItem(equalToIgnoringCase("item")) говоря (1.7.0_05 версия компилятора):

actual argument Matcher cannot be converted to Matcher by method invocation conversion

Что за? И что'здесь не так? ЭтоmatchIt() подпись метода или являетсяeveryItem() Подпись Hamcrest разработана неправильно? Или это просто система дженериков Java, не подлежащая ремонту? Большое спасибо за ваши комментарии!

РЕДАКТИРОВАТЬ @rlegendi Мое намерение состоит в том, чтобы предоставить клиенту интерфейс для добавления и выполнения предикатов о списке. Тот'сmatchIt() метод. призваниеmatchIt(anything()) Имеет смысл в этом сценарии, клиент хочет знать, является ли список чем-либо. призваниеmatchIt(empty()) означает, что клиент хочет знать, пуст ли список. Наоборот дляmatchIt(everyItem(equalToIgnoringCase("item"))) а также .matchIt(hasItem("item"))

Моя цель здесь иметьЛучший matchIt() возможна подпись метода.Matcher отлично работает для всех предыдущих сценариев. Тем не менее, я считаю, что клиент должен иметь возможность добавлятьMatcher также совпадают (например,matchIt(everyItem(notNullValue()) здесь имеет смысл, клиент хочет знать, является ли каждый элемент String в списке нулевым).

Однако я могунайти правильную подпись,matchIt(Matcher) Безразлично»работать наeveryItem(notNullValue());

Я использую Hamcrest 1.3.

РЕДАКТИРОВАТЬ 2:

Я считаю, что нашел корень недоразумения.

everyItem(anything()) выражение возвращает объект типаMatcher, Так что я могу легкоMatcher m = everyItem(anything());

Однако, что я не делаюне понимаю, почему я не могут делатьMatcher m1 = m;, Кажется, чтоMatcher не являетсяMatcher но я нене понимаю почему.

Я могу'даже не делай.Matcher m1 = m;Matcher не являетсяMatcher? Зачем?

Ответы на вопрос(2)

Ваш ответ на вопрос