匿名编译错误 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");
}
}
}
我正在研究 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");
}
}
}