Существуют способы, по крайней мере, централизовать подавление предупреждения. Например, вы можете создать подкласс Expectations
:
public static class UncheckedExpectations extends Expectations {
@SuppressWarnings("unchecked")
public <T, U extends T> U withUnchecked(Matcher<T> matcher) {
return (U) super.with(matcher);
}
}
А затем используйте дополнительные методы:
context.checking(new UncheckedExpectations() {{
one(foo).someMethod(withUnchecked(aNonNull(List.class)));
}});
Это все еще злоупотребление универсальными типами, потому что он использует параметр универсального типа в методе, который фактически не используется в параметрах и используется только в методе при небезопасном приведении. Однако это, по крайней мере, решает проблему таким образом, что не требуется, чтобы одна и та же аннотация подавления была разбросана по всему коду.
Конечно, Хамкрест мог заставить их with()
работать так же. Обидно, что они этого не сделали, потому что непроверенные предупреждения в коде Hamcrest очень распространены в любой кодовой базе, использующей библиотеку.