java - 轻松声明交叉类型的 java lambda

标签 java lambda java-8

假设我有如下方法:

public <T extends Supplier<Collection<String>> & Serializable> void doSomething(T supplier){
    new ArrayList<String>().stream().collect(Collectors.toCollection(supplier));
}

为什么会这样

doSomething(() -> new ArrayList<>());

导致了一个问题,但是

doSomething((Supplier<Collection<String>> & Serializable)() -> new ArrayList<>());

还好吗? lambda 本身在这两种情况下是完全相同的,并且在第二种情况下它可以工作。这意味着 JVM 能够创建可序列化的 lambda,但是编译器是否无法识别出这是可能的?

编辑:将第一次调用更改为我想要的。

最佳答案

来自JLS 15.16. Cast Expressions :

Casts can be used to explicitly "tag" a lambda expression or a method reference expression with a particular target type. To provide an appropriate degree of flexibility, the target type may be a list of types denoting an intersection type, provided the intersection induces a functional interface (§9.8).

并且没有评论为什么不自动推断它。我的猜测:这是可能的,但尚未实现。尤金在评论中所说的也很有趣。这是否意味着 Java 9 中将会出现类似的东西?

关于java - 轻松声明交叉类型的 java lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43116712/

相关文章:

java - Android更改 Material 高程阴影颜色

java - 创建随机类新实例的最有效/最安全的方法

c# - 使用 ExpressionVisitor 修改表达式以进行自动翻译

Java 集合最大 NullPointerException

java - JPA (Hibernate) 不会增加版本列

c++ - 将 lambda 转换为 std::function 时强制执行常量正确性

python - 如何将两个 lambda 函数合并为一个?

Java 8 的 forEach 流

spring-boot - @AllArgsConstructor 和构造函数注入(inject) Spring : is private final needed?

java - 如何在beanshell中构造Java中的多个对象和JSON数组并查看输出