gpt4 book ai didi

java - 为什么我不能调用同名匿名类之外的方法

转载 作者:行者123 更新时间:2023-12-02 05:29:40 25 4
gpt4 key购买 nike

最后的代码会产生编译错误:

NotApplicable.java:7: run() in  cannot be applied to (int)
run(42);
^
1 error

问题是为什么?为什么 javac 认为我正在调用 run(),而没有找到 run(int bar)?它正确地调用了 foo(int bar)。为什么我必须使用 NotApplicable.this.run(42);?是错误吗?

public class NotApplicable {

public NotApplicable() {
new Runnable() {
public void run() {
foo(42);
run(42);
// uncomment below to fix
//NotApplicable.this.run(42);
}
};
}

private void run(int bar) {
}

public void foo(int bar) {
}
}

最佳答案

对代码示例行为的解释是 this 被定义为您当前“最”在其中的类。在这种情况下,您“最”在匿名内部类中,它是 runnable 的子类,并且没有匹配 run(int) 的方法。要扩大搜索范围,您可以通过声明 NotApplicable.this.run(42) 来指定要使用的 this

jvm 将按如下方式评估:

this -> 当前正在执行 Runnable 的实例,方法是 run()

NotApplicable.this -> 当前正在执行 NotApplicable 实例,方法为 run(int)

编译器将在嵌套树中查找与方法名称匹配的第一个方法。 ——感谢 DJClayworth 的澄清

匿名内部类不是外部类的子类。由于这种关系,内部类和外部类都应该能够拥有一个具有完全相同签名的方法,并且最里面的代码块应该能够识别它想要运行哪个方法。

public class Outer{

public Outer() {
new Runnable() {
public void printit() {
System.out.println( "Anonymous Inner" );
}
public void run() {
printit(); // prints "Anonymous Inner"
this.printit(); //prints "Anonymous Inner"

// would not be possible to execute next line without this behavior
Outer.this.printit(); //prints "Outer"
}
};
}

public void printit() {
System.out.println( "Outer" );
}
}

关于java - 为什么我不能调用同名匿名类之外的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/252267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com