我正在尝试与流 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) 由于我试图提取一些我在大多数项目中使用的常见包装 lambda 例程,我已经能够创建CheckedFunction,由PermeableFunctionFunctionalInterface子类化,绕过 try/catch 块的需要。我已经在用于 windows(v1.8.0_251)/linux(v1.8.0_261) 和其他几个在线编译器的 Oracle jdks 上测试了它(不确定那里使用了哪个实现)。
不确定这是否真的违反了规范或者是标准允许的......根据我对文档的解释,这应该是不可能的:
更准确地说,假设 B 是一个类或接口,而 A 是 B 的超类或超接口,并且 B 中的方法声明 n 覆盖或隐藏了 A 中的方法声明 m。那么:
- 如果 n 有一个 throws 子句提到任何已检查的异常类型,那么 m 必须有一个 throws 子句,否则会发生编译时错误。
- 对于 n 的 throws 子句中列出的每个已检查异常类型,相同的异常类或其超类型之一必须出现在 m 的 throws 子句的擦除(第 4.6 节)中;否则,会发生编译时错误。
- 如果 m 的未擦除 throws 子句在 n 的 throws 子句中不包含每个异常类型的超类型,则会发生编译时未检查警告。
这是我使用的示例代码:
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
PermeableFunction<Path, …Run Code Online (Sandbox Code Playgroud)