Дженерики ада: совпадение подколенного сухожилия как параметр метода
Так что давайте'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
? Зачем?