方法内不允许使用接口。

5
我已经学习了一些 OCPJP 7 认证考试的书籍,在内部类章节中发现了一些奇怪/不完整的信息。我尝试在方法内创建一个接口,但似乎你不能这样做,只能在方法内创建类。这是因为有什么原因不能这样做还是只是缺少了这个功能?
示例代码:
public class Outer {
  public void method() {
    class C {} // allowed
    interface I {} // interface not allowed here
  }
}

4
我不关心目的,我只关心原因,因为我想了解OCPJP考试中问题背后的逻辑。 - Silviu Burcea
OCPJP考试中问题背后的逻辑?祝你好运。也许这是一个误解,但从我目前所见,这些问题似乎是围绕着场景构建的(在现实中)会有不同的解决方法,即使只是为了防止相应的问题出现。在真正的代码中,你永远不应该想知道像a += --a + a++;这样的东西的结果。(并不是说这个问题不有趣或不相关) - Marco13
@Marco13 嘿嘿,我只是想尽可能地涵盖,不会去理解语言 WTFs 的结构,我只想理解逻辑问题背后的逻辑 :) - Silviu Burcea
@SilviuBurcea 对我来说这不是什么大问题。我只是不明白为什么不允许这样做。所以你问“有什么原因吗?”我回答因为接口默认是静态的。如果你再问为什么接口默认是静态的,我会说我不同意这个决定。 - emory
“它有什么作用?”例如,将接口参数化为方法的模板参数。 - Irina Rapoport
显示剩余6条评论
1个回答

9

如果你仔细阅读Java教程,你会发现:

由于接口本质上是静态的,所以不能在块内声明接口。

这意味着,如果你有一个接口,就像下面这个:

public class MyClass {
   interface MyInterface {
       public void test();
   }
}

您将能够做到

MyClass.MyInterface something = new MyClass.MyInterface() {
    public void test () { .. }
};

由于 MyInterface 将会被明确声明为 static。它与封闭类的实例绑定没有任何意义,因为它只提供了一些抽象,不必绑定到特定实例或封闭类的状态。
同样的情况也适用于接口嵌套在方法中的情况。方法内部没有任何东西可以(显式地)声明为 static(因为非静态方法会绑定到封闭类的特定实例),因此您无法拥有本地接口。

谢谢kocko,我会学习Java教程,似乎有一些隐藏的宝藏。 :) - Silviu Burcea

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