Когда использовать 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 (по крайней мере, при разработке библиотек)