Tag: 默认方法

Java 8默认方法是否打破源代码兼容性?

一般情况下,Java源代码已经向前兼容。 据我所知,在Java 8之前,编译后的类和源代码都与后来的JDK / JVM版本兼容。 [更新:这是不正确的,见下面的评论重新'枚举'等]。但是,随着在Java 8中添加默认方法,这似乎不再是这种情况。 例如,我一直使用的库有java.util.List的实现,它包含一个List<V> sort() 。 此方法返回已sorting列表内容的副本。 这个部署为jar文件依赖项的库在使用JDK 1.8构build的项目中运行良好。 然而,后来我有机会使用JDK 1.8重新编译库本身,我发现库不再编译:带有自己的sort()方法的List实现类现在与Java 8 java.util.List.sort()默认方法。 Java 8 sort()默认方法对列表进行sorting(返回void ); 我的库的sort()方法 – 因为它返回一个新的sorting列表 – 具有不兼容的签名。 所以我的基本问题是: 由于默认方法,JDK 1.8是否为Java源代码引入了前向不兼容? 也: 这是第一次这样的前锋不兼容的变化吗? 当devise和实施的默认方法是否被考虑或讨论过? 它logging在任何地方吗? 这个(确实很小)的不便是折扣而不是好处? 以下是一些在1.7下编译和运行的代码,运行于1.8以下 – 但不能在1.8下编译: import java.util.*; public final class Sort8 { public static void main(String[] args) { SortableList<String> l = new SortableList<String>(Arrays.asList(args)); […]

什么时候有一个默认方法初始化的接口?

在searchJava语言规范来回答这个问题时 ,我了解到了这一点 在一个类被初始化之前,它的直接超类必须被初始化, 但是这个类实现的接口没有被初始化。 类似地,接口的超级接口在初始化之前不会被初始化。 为了我自己的好奇心,我尝试了它,并且如预期的那样, 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 static […]

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() { // ^^^^^^^^^^^^ Modifier 'synchronized' […]

为什么在Java 8接口方法中不允许“final”?

Java 8的最有用的function之一是接口上的新的default方法。 基本上有两个原因(可能还有其他原因)为什么被引入: 提供实际的默认实现。 示例: Iterator.remove() 允许JDK API进化。 例如: Iterable.forEach() 从APIdevise者的angular度来看,我希望能够在接口方法上使用其他修饰符,例如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是一个class级,以上是已经很普遍的做法: abstract class Sender { // Convenience method to send an empty message […]

Java8:为什么禁止从java.lang.Object中定义一个方法的默认方法

默认的方法在我们的Java工具箱中是一个很好的新工具。 但是,我试图编写一个接口来定义toString方法的default版本。 Java告诉我这是被禁止的,因为在java.lang.Object声明的方法可能不是default 。 这是为什么? 我知道有“基类总是赢”的规则,所以在默认情况下(双关语), Object方法的任何default实现将被来自Object的方法覆盖。 但是,我没有看到为什么在规范中不应该有Object方法的exception。 特别是对于toString ,有一个默认的实现可能是非常有用的。 那么,Javadevise者为什么决定不允许default方法从Object覆盖方法的原因是什么呢?

Java 8中默认或Defender方法的用途

Java 8包含了一个名为Defender方法的新function,它允许在界面中创build默认的方法实现。 现在首先这是Java中所有精简程序员的巨大转变。 我查看了Brain Goetz给出的一个JavaOne 13演示文稿,他正在讨论Collections库中新的stream()和parallelStream()实现。 为了在Collection接口中添加新的方法,他们不能在不破坏以前的版本的情况下添加新的方法。 所以他告诉说,为了配合这个,添加了Default方法的一个新特性。 public interface SimpleInterface { public void doSomeWork(); //A default method in the interface created using "default" keyword default public void doSomeOtherWork(){ System.out.println("DoSomeOtherWork implementation in the interface"); } } 现在我的问题基本上是默认的方法只需要添加新的方法接口而不破坏客户端代码有帮助吗? 或者还有其他一些用途吗?

在Java 8中与默认方法与抽象类的接口

由于Java 8允许在名为Default Method的接口中默认实现方法 ,所以在我将何时使用abstract class之间似乎存在混淆。 那么何时应该使用默认方法的接口,何时应该使用抽象类呢? 抽象类在这种情况下仍然有用吗?