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

问题描述 投票:13回答:1

示例:

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 static java-8
1个回答
9
投票

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

interface Outer {
    public default String get() {
        return "hi";
    }
    public static class Inner {
        String got() {
            return get();
        }
    }
}

作为the JLS Chapter 9.5 (Java 8)状态

接口中的成员类型声明为隐式public,并且static。允许冗余地指定这两个或其中之一修饰符。

所以,如果有的话

Inner innerInstance = new Outer.Inner();
innerInstance.got();

将调用什么get()?此处不涉及类型为Outer的对象。

是否存在外部与外部之间存在这种差异的根本原因类和外部接口?

这不是问题。 您的班级代码是inner classes的示例,即。非static嵌套类。 接口代码是static嵌套类的示例。您正在比较两种不同的东西。

在封闭类中具有static嵌套类的等效示例是

class Outer {
    String get() {
        return "hei";
    }

    public static class Inner {
        String got() {
            return get(); // won't compile
        }
    }
}

再次出现get()没有意义,因为没有相应的(封闭的)实例来调用它。


[问题,如@Radiodef所述,为

为什么该类必须是隐式静态的呢?现有规格?

然后我的答案如下:

根据定义,接口是

独立系统或不同群体相互作用的点

接口没有状态,没有行为。它仅描述行为。接口成员隐式为static,因为接口没有状态。

© www.soinside.com 2019 - 2024. All rights reserved.