Questions tagged «default-method»


5
为什么Java 8接口方法中不允许“最终”?
Java 8最有用的功能之一是default接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因): 提供实际的默认实现。例:Iterator.remove() 允许JDK API演进。例:Iterable.forEach() 从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如final。在添加便捷方法时,这将很有用,以防止在实现类时“意外”覆盖: interface Sender { // Convenience method to send an empty message default final void send() { send(null); } // Implementations should only implement this method void send(String message); } 如果Sender已经上过课,以上是已经很普遍的做法: abstract class Sender { // Convenience method to send an empty message final void …

4
显式调用Java中的默认方法
Java 8引入了默认方法,以提供扩展接口的功能,而无需修改现有的实现。 我想知道当由于不同接口中的默认实现冲突而导致该方法的默认实现被重写或不可用时,是否可以显式调用该方法的默认实现。 interface A { default void foo() { System.out.println("A.foo"); } } class B implements A { @Override public void foo() { System.out.println("B.foo"); } public void afoo() { // how to invoke A.foo() here? } } 考虑上面的代码,您将如何A.foo()从B类的方法调用?

2
Java 8接口方法中不允许“同步”的原因是什么?
在Java 8中,我可以轻松地编写: interface Interface1 { default void method1() { synchronized (this) { // Something } } static void method2() { synchronized (Interface1.class) { // Something } } } 我将获得在类中也可以使用的完整同步语义。但是,我不能synchronized在方法声明上使用修饰符: interface Interface2 { default synchronized void method1() { // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here } static synchronized void method2() { …

5
Java8:为什么禁止为java.lang.Object中的方法定义默认方法
默认方法是Java工具箱中一个不错的新工具。但是,我试图编写一个定义方法default版本的接口toString。Java告诉我这是禁止的,因为在中声明了方法java.lang.Object可能无法default编辑。为什么会这样呢? 我知道有一个“基类总是赢”的规则,因此默认情况下(pun;),default该Object方法的任何实现都会被该方法覆盖Object。但是,我认为没有理由为什么Object规范中的方法不应有例外。尤其是因为toString默认实现可能非常有用。 那么,Java设计者决定不允许default方法覆盖方法的原因是什么Object?

1
Java 8默认方法作为特征:安全吗?
使用默认方法作为 Java 8中穷人的特性版本,是安全的做法吗? 有人声称,如果只是为了大熊猫而使用它们,可能会使大熊猫感到难过,因为它很酷,但这不是我的意图。还经常提醒我们,引入了默认方法来支持API的演进和向后兼容性,这是对的,但这并没有错误或扭曲地将其用作特征。 我想到了以下实际用例: public interface Loggable { default Logger logger() { return LoggerFactory.getLogger(this.getClass()); } } 或者,也许定义一个PeriodTrait: public interface PeriodeTrait { Date getStartDate(); Date getEndDate(); default isValid(Date atDate) { ... } } 诚然,可以使用组合(甚至辅助类),但是它看起来比较冗长和混乱,并且不能从多态中受益。 因此,可以将默认方法用作基本特征,还是我应该担心无法预料的副作用? 关于SO的几个问题与Java vs Scala特性有关。这不是重点。我也不只是在征求意见。相反,我正在寻找一个权威的答案或至少是对领域的洞察力:如果您在公司项目中使用默认方法作为特质,那是否真是定时炸弹?

4
何时使用默认方法初始化接口?
当搜寻通过Java语言规范来回答这个问题,我学到的是 在初始化类之前,必须先初始化其直接超类,但不初始化由该类实现的接口。同样,在初始化接口之前,不会初始化接口的超级接口。 出于我自己的好奇心,我尝试了一下,并且未如预期的那样对接口InterfaceType进行了初始化。 public class Example { public static void main(String[] args) throws Exception { InterfaceType foo = new InterfaceTypeImpl(); foo.method(); } } class InterfaceTypeImpl implements InterfaceType { @Override public void method() { System.out.println("implemented method"); } } class ClassInitializer { static { System.out.println("static initializer"); } } interface InterfaceType { public …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.