为什么接口不能是final的?

6

JLS 2.13.1 接口修饰符

接口不能被定义为final,因为这样的类的实现永远不可能完成。

如果我在接口中可以创建静态内部类并在其中提供实现,为什么会有这样的限制?

interface Type {

    // Normal
    class Value {
        private Value() {
        }

        public void print() {
            System.out.println("Test");
        }
    }

    public final Value value = new Value();
}

请提供一些代码来说明你的建议。 - Kerrek SB
一个final接口的意义是什么? - Oded
@MaVRoSCy 确实是有效的。我刚刚用谷歌搜索了一下。这种写法很常见吗? - mauris
@mauris 从未使用过类似的东西。 - MaVRoSCy
4个回答

9

在接口中,您无法提供任何形式的实现:甚至没有静态方法。没有意义使任何方法最终,因为它们尚未实现。

代码示例:

比如说我有一个名为IExample的接口和它的具体实现Example

interface IExample{

    public final void run();

}

class Example implements IExample{

    // wait! I can't override because it's final! but it's yet to be implemented?!
    public void run(){ 
        
    }

}

4

顺便提一下:当定义此限制时,嵌套类还不可用,因此问题可能是为什么没有取消这个限制。


final类不能有任何子类。通常最好使用接口来定义子类的方法,所以两者是矛盾的。

您可以使用接口来实现其他功能:

  • 注释
  • javadocs
  • 常量
  • 仅定义嵌套类。

但这些都与接口的目的无关。


1
当final关键字出现在类声明中时,它意味着该类可能永远不会被子类化或覆盖。这可以防止特定类的过度专业化。从某种意义上说,创建类的人认为对其主要目的进行任何进一步更改都是离题的。
参考:Final 接口代表行为,而不是实现,因此将其设置为final没有意义。

0
如果我可以在接口中创建静态内部类并在其中提供实现,那么为什么会有这样的限制呢?
是的,您可以在其中声明一个内部类,但问题在于,一个 final 接口将是不可能实现的接口。任何实现它的类都将违反 final 限制。Java 设计者得出结论,这没有太多意义,并且由于没有令人信服的带有嵌套类的 final 接口的用例,因此没有理由放宽此限制。
* - 我不会声称不能发明一个用例。但是,我从未听说过人们编写具有内部类的接口,并且其意图是该接口不应被实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接