从内部类到外部接口的非静态访问的基本障碍

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)

Sot*_*lis 9

也许我误解了你的问题,但你的代码片段完全等同于

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)所述

在接口的成员类型声明是隐式publicstatic.允许冗余地指定这些修饰符中的一个或两个.

所以如果你这样做了

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成员.重要的是它是一个引用类型,而不是它是一个接口.