【问题标题】:Interface is not allowed inside methods方法内部不允许使用接口
【发布时间】:2014-09-30 13:44:42
【问题描述】:

我研究了一些有关 OCPJP 7 认证的书籍,并且在内部课程一章中有一些奇怪/不完整的信息。我试图在方法内创建接口,但似乎你不能这样做,你只能在方法内创建类。有什么理由你不能这样做还是只是缺少一个功能?

示例代码:

public class Outer {
  public void method() {
    class C {} // allowed
    interface I {} // interface not allowed here
  }
}

【问题讨论】:

  • 它有什么用途?
  • 我不在乎目的,我只在乎原因,因为我想了解 OCPJP 考试题目背后的逻辑。
  • OCPJP 考试题目背后的逻辑? - 祝一切顺利。也许这是一个误解,但就我目前所见,问题似乎是围绕(实际上)会以不同方式解决的场景构建的 - 并且只是为了防止相应的问题产生。在实际代码中,您永远不必怀疑a += --a + a++; 之类的结果是什么。 (并不意味着这个问题不有趣或不相关)
  • @Marco13 he he,我只是想尽可能地覆盖,我不会尝试理解WTFs的语言结构,我只是想了解逻辑问题背后的逻辑:)跨度>
  • @molbdnilo 我不明白为什么我们不允许这样做。我知道答案是因为接口是隐式静态的,但为什么它们必须是静态的呢?也许我想在method 中定义多个I 实现。现在我可以了,但我必须在method 之外定义I。为什么如果I 完全在method 内定义和使用,我应该在method 之外定义I。将事物定义得尽可能接近它们的使用位置似乎是一个好习惯。

标签: java methods interface scjp


【解决方案1】:

如果你仔细阅读Java Tutorials,你会看到:

您不能在块内声明接口,因为接口本质上是静态的。

这意味着如果你有一个界面,就像这样:

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

你可以做到

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

因为MyInterface 将明确为static。绑定到封闭类的实例是没有意义的,因为它只是提供了一些抽象,而不必绑定到特定实例或封闭类的状态。

同样的情况,接口嵌套在一个方法中。方法中的任何内容都不能(明确地)static(因为非静态方法与封闭类的特定实例相关联),因此您不能拥有本地接口。

【讨论】:

  • 谢谢kocko,我会研究Java教程,看来那里有一些隐藏的宝石。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
  • 2016-09-06
  • 2011-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多