java编译器如何检查接口中的所有方法是否都已实现?

java编译器如何检查接口中的所有方法是否都已实现?,java,javacompiler,Java,Javacompiler,如果我声明我的对象实现了一个接口,但没有实现这些方法,当我编译代码时,我会得到一个编译器错误。java编译器如何知道我没有实现接口的所有方法 java编译器如何知道我没有实现接口的所有方法 它知道类实现的所有方法,因为它在编译期间发现并分析了这些方法 它知道在类的所有超类和接口中定义的所有方法,因为: 它要么刚刚编译了它们的源代码,要么加载了它们的“.class”文件,然后 它分析了接口/类,并找出了类需要实现哪些方法 然后对两种方法进行了比较。(请注意,方法不需要完全相同。例如,实际方法可以在

如果我声明我的对象实现了一个接口,但没有实现这些方法,当我编译代码时,我会得到一个编译器错误。java编译器如何知道我没有实现接口的所有方法

java编译器如何知道我没有实现接口的所有方法

它知道类实现的所有方法,因为它在编译期间发现并分析了这些方法

它知道在类的所有超类和接口中定义的所有方法,因为:

  • 它要么刚刚编译了它们的源代码,要么加载了它们的“.class”文件,然后

  • 它分析了接口/类,并找出了类需要实现哪些方法

  • 然后对两种方法进行了比较。(请注意,方法不需要完全相同。例如,实际方法可以在接口中返回方法返回类型的子类型。集合比较需要考虑到这一点。)



    (实际上,这只是执行此检查的一种方法。实际的Java编译器可能会执行稍微不同的检查。)

    它可以访问接口和类。为什么它不知道?这个问题类似于问:“编译器如何知道字符串文字不能分配给int变量?”@resueman我正在寻找更深入的解释。例如,由于接口是抽象类型,如何进行类型检查以及编译器如何表示接口来进行这些检查。更深入的解释是:“除非声明的类是抽象的,否则必须实现每个直接超级接口的所有抽象成员方法(§8.4.8.1)通过此类中的声明或从直接超类或直接超接口继承的现有方法声明,因为非抽象类不允许有抽象方法(§8.1.1.1)。“编译器根据语言规范检查类声明。@isnot2bad Yes,这个问题与类型检查有关,但与那个问题不太相似。这是一个很好的答案,完成这个问题。。。在Java中,接口是一种抽象类型,它是一组具有定义良好且相互一致语义的操作。Java编译器有一个类型检查器,它确保程序遵守该语言的类型兼容性规则。因此,类型检查器只需检查类是否有具有适当返回类型的方法签名,如果没有,则返回错误。资料来源: