Когда использовать PECS при разработке библиотеки?

Я работаю над библиотекой, в которой интенсивно используются функциональные интерфейсы, и в настоящее время думаю, стоит ли применять PECS или нет:

Predicate<A>
Function<A,B>
BiFunction<A,B,C>

против

Predicate<? super A>
Function<? super A, ? extends B>
BiFunction<? super A,? super B,? extends C>

Это только кажется настолько загроможденным, и даже сообщения об ошибках превращаются из:

Incompatible types: Function<Item, Long> is not convertible to Function<Item, String>

что-то вроде

Incompatible types: 
Function<capture of ? super Item, capture of ? extends Long> is not 
convertible to Function<capture of ? super Item, capture of ? extends String>

который так трудно читать. Я прочитал следующий вопрос, но все еще не могу решить, применять его или нет, так как он загрязняет код библиотеки и ухудшает сообщения об ошибках компилятора. Лично я бы выбрал PCES для Predicate<A> варианты.

Есть ли какое-то руководство, применять ли PECS или нет? Я знаю плюсы и минусы, но мне интересно, как часто люди действительно хранят, например, Predicate в полях как на lamdas и ссылки на методы не влияет то, что предлагает PECS. Я не нашел дальнейших советов в Интернете. Вот один из классов, затронутых этим.

1 ответ

Как подробно обсуждалось в комментариях ниже, основной пост: согласованность и согласованность с JDK / стандартной библиотекой и ее использование PECS с достигнутым улучшением совместимости с помощью PECS - хороший аргумент, чтобы всегда использовать PECS (по крайней мере, при разработке библиотек)

Другие вопросы по тегам