我正在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");
}
}
}
有人可以帮助我理解,为什么我会收到此错误?如何解决它
对于那些不了解代码的人,请找到随附的屏幕截图。
答案 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");
}
}
}