tho*_*dge 13 java static java-8
例:
interface Outer {
default String get() {
return "hi";
}
class Inner {
String got() {
return get();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生错误
java:非静态方法get()不能从静态上下文中引用.
内部接口/类始终是静态的; 与外部类不同,除非声明为静态,否则它是非静态的.
这就是今天和即将发布的Java 8中的事情.外部类和外部接口之间存在这种差异的根本原因是什么?
更新:阅读@ Radiodef的评论后,我将内部接口更改为内部类.外部类不能包含非静态内部接口,因此该示例令人困惑.无论如何,内心阶层真的是我想要的.
更新:供参考.这是完全合法的:
class Outer {
String get() {
return "hei";
}
class Inner {
String got() {
return get();
}
}
}
Run Code Online (Sandbox Code Playgroud)
也许我误解了你的问题,但你的代码片段完全等同于
interface Outer {
public default String get() {
return "hi";
}
public static class Inner {
String got() {
return get();
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如JLS第9.5章(Java 8)所述
在接口的成员类型声明是隐式
public和static.允许冗余地指定这些修饰符中的一个或两个.
所以如果你这样做了
Inner innerInstance = new Outer.Inner();
innerInstance.got();
Run Code Online (Sandbox Code Playgroud)
什么会get()被调用?这里没有Outer涉及类型的对象.
外部类和外部接口之间存在这种差异的根本原因是什么?
这不是问题.你的类代码是内部类的一个例子,即.非static嵌套类.接口代码是static嵌套类的示例.你正在比较两件不同的事情.
static封闭类中具有嵌套类的等效示例将是
class Outer {
String get() {
return "hei";
}
public static class Inner {
String got() {
return get(); // won't compile
}
}
}
Run Code Online (Sandbox Code Playgroud)
get()因为没有相应的(封闭的)实例来调用它,所以再次工作是没有意义的.
如果问题正如@Radiodef所说的那样
除了这是现有的规范之外,为什么这个类必须是隐式静态的呢?
那么我的答案如下:
根据定义,接口是
独立系统或不同群体互动的点
接口没有状态,也没有行为.它只是描述行为.接口成员是隐式的,static因为接口没有状态.另一方面,接口类型具有状态是有意义的,即.static成员.重要的是它是一个引用类型,而不是它是一个接口.