Java 设计库时何时使用PECS?

Java 设计库时何时使用PECS?,java,java-8,functional-programming,pecs,Java,Java 8,Functional Programming,Pecs,我正在开发一个大量使用功能接口的库,目前正在为是否应用该库而挣扎: vs 它看起来很杂乱,甚至错误信息都来自: Incompatible types: Function<Item, Long> is not convertible to Function<Item, String> 差不多 Incompatible types: Function<capture of ? super Item, capture of ? extends Long> is

我正在开发一个大量使用功能接口的库,目前正在为是否应用该库而挣扎:

vs

它看起来很杂乱,甚至错误信息都来自:

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>

这很难读。我已经读过了,但仍然在为是否应用它而挣扎,因为它污染了库代码并恶化了编译器错误消息。就我个人而言,我会选择PCE,因为谓词是受此影响的类之一。

正如在主要帖子下面的评论中广泛讨论的那样:JDK/标准库的一致性和一致性,以及使用PEC获得兼容性改进的PEC的使用,至少在设计库

链接的答案说明了一切——你可能认为你不需要它,或者目前确实找到了它的用例,但经验表明,从长远来看,使用你的库的一些用户可能会讨厌你。奇怪的是,作为基于观点的btw,我不认为它是这样的…并不是那么简单:PEC降低了库的可读性,很少有泛型知识的用户可能会被类型参数的长度弄糊涂,这使得很难推断函数做了什么,因为它的签名不容易理解,我们会收到更糟糕的错误消息。受它影响的用户仍然可以做t->mismatchPredicate.testtusers没有多少通用知识,不应该使用通用库开始,而是学习泛型;这对我来说是一个非常糟糕的论点。这个问题也可以从另一个角度来看待:因为jdk库使用PEC,当然,用户可能正在使用?扩展/super甚至没有意识到为什么这样做-你可能会打破他们对这一点的看法。有趣的事实是:即使是OpenJDK核心开发人员有时也会遇到这种情况。
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>