匿名类中的编译错误

时间:2017-06-20 09:39:39

标签: java anonymous-class

我正在anonymous classes工作,在工作的时候,我想出了一个案例,我无法使用anonymous class来调用方法。

我在m1()

处遇到编译错误
  

new I(){}类型中的方法m1(int)不适用于   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");
            } 

        }
    }

有人可以帮助我理解,为什么我会收到此错误?如何解决它

对于那些不了解代码的人,请找到随附的屏幕截图。

3 个答案:

答案 0 :(得分:2)

如果要在m1()中调用C方法 - 唯一不带参数的m1方法 - 来自匿名类,则必须符合this的条件:< / p>

C.this.m1();

答案 1 :(得分:1)

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

所以这个方法:

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

尝试调用非现有方法。

请注意,m1()相当于this.m1()this是您的匿名内部类的实例,而不是外部C类的实例。

要调用外部类的m1方法,您需要执行以下操作:

C.this.m1();

查看 Shadowing 标题下的完整说明here

答案 2 :(得分:1)

您有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");
        }
    }
}

或限定nethod,因此编译器可以知道你的意思是哪个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");
        } 

    }
}