为什么Java中没有最终接口?

Tom*_*sky 7 java oop interface

扩展接口只是添加了要在任何实现者中定义的附加操作,并且不能破坏任何现有的实现(与扩展类不同).但它可以改变(编辑3个常数)并因此改变常数的PERCIEVED值(编辑2由实现类看到).

例如,以下内容:

interface A {
  int TEST = 6;
}

interface B extends A {
  int TEST = 7;
}

public class InterfacesTest implements B {
  public static void main(final String[] args) {
    System.out.println(TEST);
  }
}
Run Code Online (Sandbox Code Playgroud)

产生7,或许接口的意图A是任何A包含一个test值为6 的字段的实现.

如果A被宣布为最终,我们可以确保所有实现A看到相同的值test.

那么有谁理解为什么这是不可能的?

  • PS:这不是这个问题的重复 ,我知道他们 不能是最终的,我对导致这个结果的设计决策背后的想法感兴趣.

  • PPS:我理解接口中的常量通常是一个坏主意,这不是问题.

编辑:请检查修订历史记录,这个问题的标题是以不反映问题意图的方式编辑的.对于回答我没问的问题的每个人都很抱歉.是的,接口字段是隐式公共静态最终的,不幸的是,这根本不是我感兴趣的.

编辑2要绝对清楚:这个问题是关于为什么接口不能阻止其他接口扩展它(通过最终或某些等效).

jbi*_*del 11

最终的.事实上,public static final即使你没有宣布这些,也是如此.你正在做的不是重写常量变量; 您正在隐藏父接口的版本.

检查一下,A.TEST没有被覆盖.它仍然是6.

的System.out.println(A.TEST);

  • 此外,您可以对类进行相同的操作.在父类中声明你的`public static final int A = 6`,然后在子类中将它重新定义为`public static final int A = 7`.这称为*隐藏*而不是覆盖,因为父类的版本是隐藏的,除非您指定它. (2认同)

Vic*_*kin 5

接口的主要目的不是常量的容器,而是定义一些由具体类实现的API.

并且,从lang spec(9.4. Abstract method declarations):

请注意,接口中声明的方法不能声明为final或发生编译时错误.但是,在接口中声明的方法可以通过在实现接口的类中声明为final的方法来实现.

  • 但是,如果你可以将整个接口定义为`final`,那么这意味着所有接口的方法也都是`final`.规范明确禁止这一点. (2认同)