gpt4 book ai didi

java - 当 Predicate 而不是 Predicate

转载 作者:行者123 更新时间:2023-12-03 09:26:21 25 4
gpt4 key购买 nike

我正在尝试与流 api 一起使用的预定义身份过滤器。不幸的是,我无法正确返回符合 stream api documentation 的通用谓词。 .
根据这里的反编译器是 Stream::filter定义:

public interface Stream<T> extends BaseStream<T, Stream<T>> {

Stream<T> filter(Predicate<? super T> var1);
我正面临任何支持 Streams (8~15) 的 Java 版本的问题。这个问题与我的实现无关。这段代码实际上足以重现它:
        Collection<String> result = Stream.of("A", "B", "C")
.filter(new Object()::equals)
.filter(Integer.valueOf(-1)::equals)
.collect(Collectors.toSet());
在这里,应用了两个谓词,它们都不是 <? super String>符合...
根据 this answer这种行为似乎很奇怪......
我应该如何防止我图书馆的用户过滤 ServerState通过随机对象相等性检查等...?
理想情况下,我希望始终返回正确的 Predicate 不幸的是,没有任何编译时错误支持......
在这种情况下,使用 linter 不是解决方案。
尽管我知道下限通配符是如何工作的,但我一直缺少的是 Predicate<? super Integer>可以成功转换到 Predicate<? super String> .
在哪里:
Predicate<? super String> stringPredicate = (Predicate<? super String>)Filters.is_tClass(Integer.class, 4);
Predicate<? super Server> serverPredicate = (Predicate<? super Server>)Filters.is_comparable(5);

Collection<Integer> result = Stream.of(1, 2, 3)
.filter((Predicate<? super Integer>)stringPredicate)
.filter((Predicate<? super Integer>)serverPredicate)
.filter(Filters.is(new Object()))
.collect(Collectors.toSet());
结果 []空结果集。
这是我到目前为止所拥有的,但对其中任何一个都不满意:
import java.util.Collection;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {

public static void main(String[] args) {

Collection<Integer> result = Stream.of(1, 2, 3)
//.filter(Filters.is_tClass(Integer.class, 4)) // enforce user to provide target class
//.filter(Filters.is_comparable(5)) // use only Comparable
.filter(Filters.is(new Server())) // fail runtime with custom exception
.collect(Collectors.toSet());

System.out.println(result);
}

private static class Server {
}

private static class Filters {

private static <T> Predicate<? super T> is(T other) {

return t -> {

// simple class equality check - error prone!
Class<?> tClass = t.getClass();
Class<?> otherClass = other.getClass();

if (!tClass.equals(otherClass)) {

throw new RuntimeException(
String.format("Check equality for [%s ? %s] seems odd. Can not continue...", tClass, otherClass));
}
return t.equals(other);
};
}

static <T> Predicate<? super T> is_tClass(Class<T> tClass, T other) {

return is(other);
}

static <T extends Comparable<T>> Predicate<? super T> is_comparable(T other) {

return is(other);
}
}
}
具有类型名称的方法 is_*在此处发布示例之前不存在,因此将被删除...
编辑
尽管我知道下限通配符是如何工作的,但我一直缺少的是 Predicate<? super Integer>可以成功转换到 Predicate<? super String> .
在哪里:
Predicate<? super String> stringPredicate = (Predicate<? super String>)Filters.is_tClass(Integer.class, 4);
Predicate<? super Server> serverPredicate = (Predicate<? super Server>)Filters.is_comparable(5);

Collection<Integer> result = Stream.of(1, 2, 3)
.filter((Predicate<? super Integer>)stringPredicate)
.filter((Predicate<? super Integer>)serverPredicate)
.filter(Filters.is(new Object()))
.collect(Collectors.toSet());
结果 []空结果集。

最佳答案

Here, two predicates are applied where both of them aren't <? super String> compliant


这不是真的:这 2 个谓词确实消耗了 Object ,它是 String 的父级. <? super String>不得与 <? extends String> 混淆.

关于java - 当 Predicate<? 时,强制 Stream::filter 方法在编译时失败传递 super Object> 而不是 Predicate<? super T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64536406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com