【发布时间】:2014-01-28 23:02:12
【问题描述】:
例子:
interface Outer {
default String get() {
return "hi";
}
class Inner {
String got() {
return get();
}
}
}
这会产生错误
java:不能从静态上下文引用非静态方法 get()。
内部接口/类总是静态的;与外部类不同,除非声明为静态,否则它是非静态的。
这就是今天和即将到来的 java 8 中的情况。外部类和外部接口之间的这种差异是否存在根本原因?
更新: 阅读@Radiodef 的评论后,我将内部接口更改为内部类。外部类不能包含非静态内部接口,因此该示例令人困惑。无论如何,内部类确实是我想要的。
更新:供参考。这是完全合法的:
class Outer {
String get() {
return "hei";
}
class Inner {
String got() {
return get();
}
}
}
【问题讨论】:
-
在 Java 8 之前,我会说这是因为接口不是对象,也不包含数据(不能有非静态成员字段);向接口添加数据会使实现更加复杂,因为接口允许多重继承;并且非静态内部接口必须有一个指向外部对象的指针,即数据。我不知道在 Java 8 中是否仍然如此。
-
澄清一下,一般来说,您想知道为什么接口不能有内部类? (因为接口也不能有内部类。)普通类也不能有“内部接口”。
-
在 Java 中,没有什么会强迫您在
Outer实现中拥有Inner实现,因此Inner无法了解有关Outer的任何信息。 -
@Darkhogg 一个内部类/接口知道外部类
-
非静态内部类实例知道封闭的外部类实例,因为它们带有对它的隐式引用。我怀疑接口可以做到这一点,因为它们不允许包含状态。这也解释了为什么您的代码无法按预期工作 - 没有引用可以调用
get()的Outer实例。