设计库时何时使用PECS?

时间:2019-05-26 18:56:30

标签: java java-8 functional-programming pecs

我正在开发一个库,该库大量使用功能接口,并且目前很难决定是否应用PECS

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

vs。

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>

很难读。我已经读过following question,但是仍然难以解决是否应用它,因为它会污染库代码并加剧编译器错误消息。我个人会为Predicate<A>变体选择PCES。

是否有一些准则适用于PECS?我知道优缺点,但我不知道人们会经常存储例如PECS提供的内容不会影响Predicate作为lamda和方法引用的字段。我在网上找不到更多建议。 Here是受此影响的类之一。

1 个答案:

答案 0 :(得分:1)

正如在主要文章下面的评论中广泛讨论的:与JDK /标准库的一致性和一致性,以及PECS的使用以及通过使用PECS获得的兼容性改进,始终使用PECS是一个很好的理由(至少在设计库时) )