【问题标题】:Java 8: Accessibility of Interface membersJava 8:接口成员的可访问性
【发布时间】:2014-04-04 18:24:36
【问题描述】:

辅助功能

Java 8 Says:

接口的所有成员缺少访问修饰符都是隐式公开的

Java 7 says:

接口的所有成员都是隐式公开的。

当我尝试以下代码时:

public interface Test {
    protected int i = 10;
}

并编译,我得到了

Test.java:3:错误:此处不允许修饰符受保护
        受保护的int i = 10;
                      ^

Java 版本: Java(TM) SE Runtime Environment (build 1.8.0-b129)

但是在上面的Interface 成员声明中我不缺少访问修饰符那么为什么我会收到这个错误。

【问题讨论】:

  • 访问说明符只允许用于我猜的方法,因为 Java 8 支持 iterface 中的默认方法实现。
  • @Puru-- 我试过protected void testMethod();,但出现编译错误。 Illegal modifier for the interface method test; only public & abstract are permitted
  • 和规范说All members of interfaces lacking access modifiers are implicitly public不仅仅是方法
  • 是的语句没有说,具体的访问修饰符,我猜你可以考虑default作为访问修饰符。但你是对的,除了publicdefault,你将无法使用任何其他东西
  • 我可能没记错。我发现这两个在接口中提到受保护的线程:mail.openjdk.java.net/pipermail/lambda-dev/2012-July/…mail.openjdk.java.net/pipermail/lambda-dev/2012-August/…

标签: java java-8 jls


【解决方案1】:

您引用的内容在 Determining Accessibility with Names 的 JLS 部分中

所有缺少访问修饰符的接口成员都是隐式公开的

您真正需要查看的是interface field declarations 上的部分,其中指出

ConstantDeclaration:
    {ConstantModifier} UnannType VariableDeclaratorList ;
ConstantModifier:
    Annotation public 
    static final

接口主体中的每个字段声明都是隐式的 publicstaticfinal。允许冗余指定任何 或所有这些字段的修饰符。

所以这些是你可以使用的修饰符。您上面引用的部分是指您不使用任何访问修饰符时,在这种情况下,它将隐含为public

【讨论】:

  • 请详细说明Determining Accessibility with Names的含义
  • @Vishrant 正如 JLS 所述,Names are used to refer to entities declared in a program. 因此,确定可访问性是确定在程序中的某个点,您是否可以通过实体名称访问实体。
【解决方案2】:

接口应该意味着“你可以从课堂之外看到的东西”。添加非公共变量或方法是没有意义的。因此,接口不允许受保护的变量或方法。

【讨论】:

  • 这是根据 jls 7 但 jls 8 说的不同
  • 隐式修饰符的规则在 java 8 中没有改变。当没有指定其他修饰符时使用隐式修饰符。所有成员总是公开的,无论是隐式的还是显式的。请注意,接口字段始终是隐式公共静态的。这也没有改变。
【解决方案3】:

JLS 8 第 9.3、9.4 和 9.5 节中的以下短语与 JLS 7 相比没有变化:

接口主体中的每个字段声明都是隐式公共的、静态的和最终的。

接口主体中的每个方法声明都是隐式公开的。

接口中的成员类型声明是隐式公共和静态的。

我认为这涵盖了所有内容,因此似乎没有必要在 6.6.1 中添加“缺少访问修饰符”,除非他们想明确说明具有public 访问修饰符的成员是明确的 公开而不是隐式公开。 (并不是说我知道有任何显着差异。)

在任何情况下,阅读语言规范时都必须非常小心。我可以看到有人看到 6.6.1 中的变化会得出结论,其意图是放宽规则。但事实并非如此。事实是引用的短语 9.3、9.4 和 9.5 仍然适用,并且 6.6.1 中的措辞更改不会取代它。语言规范必须以正式和数学的方式编写,因此查看一小部分或一小部分中的一个变化并从中得出结论并不总是正确的。您确实必须了解整个规范的内容以及规范的其他部分与问题相关,这可能很困难。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-21
    • 2013-08-06
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2020-03-17
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多