Java 从内部类到外部接口的非静态访问的基本障碍
例如:Java 从内部类到外部接口的非静态访问的基本障碍,java,static,java-8,Java,Static,Java 8,例如: interface Outer { default String get() { return "hi"; } class Inner { String got() { return get(); } } } 这就产生了错误 java:无法从静态上下文引用非静态方法get() 内部接口/类始终是静态的;与外部类不同,外部类是非静态的,除非声明为静态 这就是今天和即将到来的Java8中
interface Outer {
default String get() {
return "hi";
}
class Inner {
String got() {
return get();
}
}
}
这就产生了错误
java:无法从静态上下文引用非静态方法get()
内部接口/类始终是静态的;与外部类不同,外部类是非静态的,除非声明为静态
这就是今天和即将到来的Java8中的情况。外部类和外部接口之间存在这种差异的根本原因是什么
更新:
在阅读@Radiodef的评论后,我将内部接口更改为一个内部类。外部类不能包含非静态的内部接口,因此示例很混乱。一个内部类是我想要的
更新:供参考。这是完全合法的:
class Outer {
String get() {
return "hei";
}
class Inner {
String got() {
return get();
}
}
}
也许我误解了您的问题,但您的代码片段与
interface Outer {
public default String get() {
return "hi";
}
public static class Inner {
String got() {
return get();
}
}
}
作为国家
接口中的成员类型声明隐式地public
和
静态
。允许冗余指定其中一项或两项
修饰语
所以如果你做了
Inner innerInstance = new Outer.Inner();
innerInstance.got();
在上调用什么get()
?此处不涉及类型为Outer
的对象
有没有一个根本的原因,这种差异外
类和外部接口
这不是问题所在您的类代码是的一个示例,即非静态嵌套类接口代码是静态
嵌套类的一个示例。你在比较两件不同的事情
在一个封闭类中嵌套一个静态类的等效示例如下
class Outer {
String get() {
return "hei";
}
public static class Inner {
String got() {
return get(); // won't compile
}
}
}
在这里,get()
也没有意义,因为没有相应的(封闭的)实例来调用它
如果问题是
为什么类必须是隐式静态的,除了这是
现有规范
那么我的答案是:
根据定义,接口是
独立系统或不同群体相互作用的点
接口没有状态,也没有行为。它只是描述行为。接口成员是隐式的静态的
,因为接口没有状态。我将提供一种方法让您记住它
对于静态
成员,它不绑定到声明类/接口的对象;对于非
静态
成员,它必须绑定到声明类的对象
静态的
,除了默认的
成员之外静态类内部
未绑定到接口外部
的对象(因为接口
的对象没有意义),因此它无法调用外部
的成员
对于更新中的合法对象:类内部
绑定到类外部
的对象,因此当您创建内部
的对象时,您还创建了类外部
的匿名对象,因此当您在内部::get()
中调用get()
时,get()
调用该匿名对象
希望有帮助。在Java 8之前,我会说这是因为接口不是对象,也不包含数据(不能有非静态成员字段);向接口添加数据使实现更加复杂,因为接口上允许多重继承;一个非静态的内部接口必须有一个指向外部对象(即数据)的指针。我不知道在Java8中是否仍然是这样。只是澄清一下,更一般地说,您想知道为什么接口不能有内部类?(因为接口也不能有内部类。)普通类也不能有“内部接口”,没有什么强迫您在
外部实现中使用内部实现,因此内部无法了解外部@Darkhogg内部类/接口知道外部类非静态内部类实例知道封闭的外部类实例,因为它们隐含着对它的引用。我怀疑接口能做到这一点,因为它们不允许包含状态。这也解释了为什么您的代码不能按预期工作-没有引用可以调用get()
的Outer
实例。我认为问题不是“为什么这个不能工作?”而是“为什么这个不能工作?”或者换句话说,“除了现有规范之外,为什么类必须是隐式静态的?“@Radiodef My edit是我能做的最好的回答。内部类需要保存对外部接口的引用,而不是反向引用。在Java 8之前,我可以承认关于接口中行为的论点,但对于扩展方法,这个论点是多余的。@thoredge您是否建议Java 8+接口现在应该支持声明静态
和非静态
嵌套类?这没有帮助。默认方法使用接口对象;理论上,内部阶级也是如此。当然不是现在,而是现在principle@thoredge:您能否提供“默认方法使用接口对象”的来源?我目前的想法是默认方法必须继承子类对象……是的;同样,内部成员类可以绑定到继承子类对象。我把你的“接口对象”理解为