小编dbl*_*dbl的帖子

当 Predicate<? 时,强制 Stream::filter 方法在编译时失败 传递 super Object> 而不是 Predicate<? 超级T>

我正在尝试与流 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)

java java-stream

7
推荐指数
1
解决办法
153
查看次数

Lamdas 绕过 try/catch 块来检查异常

由于我试图提取一些我在大多数项目中使用的常见包装 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)

java lambda exception java-8

5
推荐指数
1
解决办法
146
查看次数

标签 统计

java ×2

exception ×1

java-8 ×1

java-stream ×1

lambda ×1