匿名编译错误 class

Compilation error in anonymous class

我正在研究 anonymous classes,在工作时我遇到了无法使用 anonymous class 调用方法的情况。

我在 m1()

处遇到以下编译错误

The method m1(int) in the type new I(){} is not applicable for the arguments ()

 interface I {
        public void m1(int arg1);
    }

    class A {
        static void m2(I i) {
        }
    }

    class B {

        class C {
            void m4() {
                A.m2(new I() {
                    public void m1(int arg1) {
                        m1();// Getting compilation error here.
                    }
                });
            }

            void m1() {
                System.out.println("Inside M1");
            } 

        }
    }

有人可以帮助我理解为什么会出现此错误吗?如何解决

对于那些不理解代码的人,请查看随附的屏幕截图。

名为 I 的接口没有不带参数的方法 m1()

所以这个方法:

public void m1(int arg1) {
    m1();// Getting compilation error here.
}

尝试调用不存在的方法。

请注意 m1() 等同于 this.m1()this 是匿名内部 class 的实例,而不是外部 C class.

的实例

要调用外部 class 的 m1 方法,您需要做:

C.this.m1();

阴影 header 下查看完整解释 here header。

如果您想调用 C 中的 m1() 方法 - 唯一不带参数的 m1 方法 - 来自匿名 class,您必须限定 this:

C.this.m1();

里面有3个选项:

重命名 void m1() 方法将是避免搬起石头砸自己脚的方法!

 class B {

    class C {
        void m4() {
            A.m2(new I() {
                public void m1(int arg1) {
                    m1Foo();// Getting compilation error here.
                }
            });
        }

        void m1Foo() {
            System.out.println("Inside M1");
        } 

    }
}

或者如果你不能/不想那么把它变成一个 lambda

class B {

    class C {
        void m4() {
            A.m2(arg1 -> m1());
        }
        void m1() {
            System.out.println("Inside M1");
        }
    }
}

或者限定方法,这样编译器可以知道你指的是哪个m1

class B {

    class C {
        void m4() {
            A.m2(new I() {
                public void m1(int arg1) {
                    C.this.m1(); 
                }
            });
        }

        void m1() {
            System.out.println("Inside M1");
        } 

    }
}