轻松声明交集类型的java lambdas

时间:2017-03-30 11:34:23

标签: 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本身都是完全相同的,而在第二种情况下,lambda本身也是如此。这意味着JVM能够创建可序列化的lambda,但是编译器无法识别这是可能的吗?

编辑:将第一个电话改为我想要的电话。

1 个答案:

答案 0 :(得分:0)

来自JLS 15.16. Cast Expressions

  

强制转换可用于显式“标记”具有特定目标类型的lambda表达式或方法引用表达式。为了提供适当程度的灵活性,目标类型可以是表示交叉点类型的类型列表,只要交集引入功能接口(第9.8节)。

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

相关问题