接口中的默认方法与difination

时间:2016-05-20 04:50:29

标签: java lambda interface overloading

我正在研究public class RotatedText : FrameworkElement { public string Text { get; set; } protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); var ft = new FormattedText(Text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("Calibri"), 12, Brushes.Black); drawingContext.PushTransform(new RotateTransform(-90, 0, ft.Width)); drawingContext.DrawText(ft, new Point(0, ft.Width)); drawingContext.Pop(); Width = ft.Height; Height = ft.Width; } } 并且有一点指出在 java 8 中我们可以在接口中声明一个带有定义的方法,如

lambada

根据规范,我们可以使用两个具有相同签名的方法,但取决于程序员他想如何使用它? 现在问题是同样的任务可以通过使用定义而不是声明来实现那么使用默认方法是什么意思?

喜欢它们的行为与常规方法定义相同,程序员需要声明正文和休息部分吗?

实际点是什么,因为它似乎有点难以理解

1 个答案:

答案 0 :(得分:0)

感谢@ElliottFrisch和@kagemusha在搜索后提示answer

为何选择默认方法?

List<?> list = …
list.forEach(…); // lambda code goes here

forEach不是由java.util.List声明的,也不是java.util.Collection接口。一个显而易见的解决方案是将新方法添加到现有接口,并在JDK中提供所需的实现。但是,一旦发布,就不可能在不破坏现有实现的情况下向接口添加方法。

因此,如果我们在Java 8中使用lambdas但是无法使用标准集合库中的lambdas,那将是非常令人沮丧的,因为不能牺牲向后兼容性。

由于上述问题,引入了一个新概念。虚拟扩展方法,或者,通常称为防御方法,现在可以添加到提供声明行为的默认实现的接口。

简单来说,Java中的接口现在可以实现方法。默认方法带来的好处是,现在可以向接口添加新的默认方法,并且不会破坏实现。

It doesn’t seem to be the language feature that would be appropriate to use every day, but it seems to be essential for Java Collections API update to be able to use lambdas naturally.