我问Brian Goetz Java中这样做的原因是什么,令我惊讶的是,他回答说
问题:允许在lambda和方法引用中使用所有SAM/SMI而不是仅标记为FunctionalInterface的原因是什么?我认为这也是人们对FunctionalInterface注解产生困惑的原因。至少对我来说,这似乎是为了防止以未经意间的方式使用未注解的接口,但它并没有这样做。人们可能会想,如果我仍然在lambda中使用它怎么办?
布莱恩·戈茨:现有的Java库充满了SAM接口。要求在声明位置启用意味着,在众多方面中,这些库在人们将其作为lambda目标使用之前必须进行更新。而且,没有任何合理的理由;这些都可以与单方法匿名类一起使用,不允许这里的lambda将仅仅是为了自我限制。至于“会多糟糕”,答案是“根本不会有多糟糕。”