我们说我的方法如下:
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,但是编译器无法识别这是可能的吗?
编辑:将第一个电话改为我想要的电话。
答案 0 :(得分:0)
来自JLS 15.16. Cast Expressions:
强制转换可用于显式“标记”具有特定目标类型的lambda表达式或方法引用表达式。为了提供适当程度的灵活性,目标类型可以是表示交叉点类型的类型列表,只要交集引入功能接口(第9.8节)。
并且没有评论为什么不自动推断它。我的猜测:它可能是可能的,但尚未实施。同样有趣的是尤金在评论中所说的。可能这意味着Java 9中会出现类似的东西吗?