可以从接口中省略公共摘要会损害字节码兼容性吗?

时间:2014-05-30 19:05:29

标签: java interface compatibility backwards-compatibility

在浏览SO问题时,我发现了Runnable

的定义
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

正如您所看到的,它在方法定义中有public abstract,这是多余的,据我所知, ,不应该包含在方法声明中。

我希望JDK团队已经看到了这一点,并期望他们仍然在这里。

因此问题是,可以从接口声明中删除public abstract会破坏字节码的兼容性吗?请记住,即使使用JDK1.0 java代码编写的代码,此Runnable在技术上仍然必须工作。

1 个答案:

答案 0 :(得分:5)

我无法找到更好的来源,但here's the JLS for Java 1.(也许here。)

与之后的其他所有JLS一样,它表示。

AbstractMethodDeclaration:

    AbstractMethodModifiers opt ResultType MethodDeclarator Throwsopt ;

AbstractMethodModifiers:

    AbstractMethodModifier

    AbstractMethodModifiers AbstractMethodModifier

AbstractMethodModifier: one of

    public abstract

注意opt。它还说明了

  

接口主体中的每个方法声明都是隐式的   抽象,所以它的身体总是用分号代表,而不是分号   块。为了与旧版Java兼容,允许使用   但作为一种风格问题,我们不鼓励冗余地指明   接口中声明的方法的abstract修饰符。

     

接口主体中的每个方法声明都是隐式的   上市。这是允许的,但强烈劝阻   样式,冗余地指定接口的公共修饰符   方法

它不会损害字节码兼容性。

他们可能只想尽可能明确。