我在阅读泛型时遇到了PECS(制片extends人和消费者的super简称).
能否给我一个人解释如何使用佩奇之间解决困惑extends和super?
我正在尝试与流 api 一起使用的预定义身份过滤器。不幸的是,我无法正确返回符合流 api 文档的通用谓词。
根据这里的反编译器是Stream::filter定义:
public interface Stream<T> extends BaseStream<T, Stream<T>> {
Stream<T> filter(Predicate<? super T> var1);
Run Code Online (Sandbox Code Playgroud)
我正面临任何支持 Streams (8~15) 的 Java 版本的问题。这个问题与我的实现无关。这段代码实际上足以重现它:
Collection<String> result = Stream.of("A", "B", "C")
.filter(new Object()::equals)
.filter(Integer.valueOf(-1)::equals)
.collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)
在这里,应用了两个谓词,它们都不<? super String>符合...
根据这个答案,这种行为似乎很奇怪......
我应该如何防止我的库的用户ServerState通过随机对象相等性检查等进行过滤?
理想情况下,我希望始终返回正确的 Predicate<? super T> 不幸的是,没有任何编译时错误支持......
在这种情况下,使用 linter 不是解决方案。
尽管我知道下限通配符是如何工作的,但我一直缺少的是 aPredicate<? super Integer>可以成功转换为Predicate<? super String>.
在哪里:
Predicate<? super String> stringPredicate = (Predicate<? super String>)Filters.is_tClass(Integer.class, 4);
Predicate<? …Run Code Online (Sandbox Code Playgroud)