Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从内部类到外部接口的非静态访问的基本障碍_Java_Static_Java 8 - Fatal编程技术网

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:您能否提供“默认方法使用接口对象”的来源?我目前的想法是默认方法必须继承子类对象……是的;同样,内部成员类可以绑定到继承子类对象。我把你的“接口对象”理解为