无法访问 Java 中的匿名 Class 方法
Unable to Access Anonymous Class Method in Java
每当我尝试从外部 class 调用属于匿名 class 的方法时,我都会收到编译器错误。示例:
public class Test {
public static void main(String[] args) {
Test testObj = new Test(){
public void doStuff(){
System.out.println("Test");
}
};
testObj.doStuff();
}
}
编译器提供的错误只是"Cannot find symbol - doStuff()"。我一定是忽略了什么……有什么想法吗?
提前致谢。
Java 是一种类型安全的语言。当你有一个 class Test
的对象(你声明 testObj
是)时,编译器只会让你调用 class [=10= 中定义的方法].即使你有一个 subclass 的实例,编译器也不会自动推断,所以它不会让你调用 subclass 方法。它只根据变量的类型。
您需要在 Test
class 中定义 doStuff
方法。
当然,这使得匿名提交class它变得很愚蠢,除非你想覆盖该方法来做其他事情。
问题本质上归结为,引用变量和对象之间的区别是什么。 testObj 变量是 Test 类型,Test 没有 doStuff 方法,只有你的匿名 class 有,但是编译器可以创建匿名类型的 object,它不能' t 创建匿名类型的变量。底线是你不应该为这种类型的代码使用匿名类型,子 class 具有不在父 class 中的方法的代码。相反,要么给父 class 方法(这里给 Test doStuff 方法),要么考虑使用私有内部 class 代替你的匿名 class.
Test
class 没有方法 doStuff()
。当您创建匿名 class 时,您添加了一个名为 doStuff()
的新方法。然后将该引用存储为 Test
类型,这样就无法访问额外的方法。
你为什么要使用这样的匿名 class?
最简单的方法就是将doStuff()
方法添加到test
public class Test {
public void doStuff(){
System.out.println("Test");
}
public static void main(String[] args) {
Test testObj = new Test();
testObj.doStuff();
}
}
您只能从测试 class 的引用中调用现有方法。因此,如果您已经声明了 doStuff()
方法,那么您只能使用 Test testObj
引用来调用它。
看到这个 SO 问题 Is it possible to call subclasses' methods on a superclass object?
但是你肯定可以在匿名的其他方法声明中调用新方法 class。请参阅下面的示例。
示例:
public class Test {
public void doStuff() {
System.out.println("Test");
}
public static void main(String[] args) {
Test testObj = new Test() {
public void doStuff() {
System.out.println("Inside anonymous class doStuff");
doOtherStuff(); // calling new method doOtherStuff() and it works
}
public void doOtherStuff() {
System.out.println("Inside anonymous class doOtherStuff");
}
};
testObj.doStuff();
/*Below code give compilation error: The method doOtherStuff() is undefined for the type Test*/
// testObj.doOtherStuff();
}
}
输出:
Inside anonymous class doStuff
Inside anonymous class doOtherStuff
问题是匿名 class 没有 类型名称 (这就是它被称为匿名的原因)。
您将匿名 class 实例分配给类型 Test
的变量,并且 Test
类型没有名为 doStuff
.
的方法
因此您不能将匿名 class 实例分配给任何变量,然后在其上调用未在 superclass.
中定义的方法
它 可以调用该方法,如果您不分配它:
public class Test {
public static void main(String[] args) {
new Test(){
public void doStuff(){
System.out.println("Test");
}
}.doStuff();
}
}
请注意,这在现实世界的 Java 程序中很少有用。
我只是展示这个来强调问题的根源:匿名 classes 当然可以拥有未在 superclass 中定义的方法,这是唯一的原因你不能轻易调用它们是因为 class 的类型是匿名的(没有名字)。但是它们仍然存在,可以直接在实例上调用。
每当我尝试从外部 class 调用属于匿名 class 的方法时,我都会收到编译器错误。示例:
public class Test {
public static void main(String[] args) {
Test testObj = new Test(){
public void doStuff(){
System.out.println("Test");
}
};
testObj.doStuff();
}
}
编译器提供的错误只是"Cannot find symbol - doStuff()"。我一定是忽略了什么……有什么想法吗?
提前致谢。
Java 是一种类型安全的语言。当你有一个 class Test
的对象(你声明 testObj
是)时,编译器只会让你调用 class [=10= 中定义的方法].即使你有一个 subclass 的实例,编译器也不会自动推断,所以它不会让你调用 subclass 方法。它只根据变量的类型。
您需要在 Test
class 中定义 doStuff
方法。
当然,这使得匿名提交class它变得很愚蠢,除非你想覆盖该方法来做其他事情。
问题本质上归结为,引用变量和对象之间的区别是什么。 testObj 变量是 Test 类型,Test 没有 doStuff 方法,只有你的匿名 class 有,但是编译器可以创建匿名类型的 object,它不能' t 创建匿名类型的变量。底线是你不应该为这种类型的代码使用匿名类型,子 class 具有不在父 class 中的方法的代码。相反,要么给父 class 方法(这里给 Test doStuff 方法),要么考虑使用私有内部 class 代替你的匿名 class.
Test
class 没有方法 doStuff()
。当您创建匿名 class 时,您添加了一个名为 doStuff()
的新方法。然后将该引用存储为 Test
类型,这样就无法访问额外的方法。
你为什么要使用这样的匿名 class?
最简单的方法就是将doStuff()
方法添加到test
public class Test {
public void doStuff(){
System.out.println("Test");
}
public static void main(String[] args) {
Test testObj = new Test();
testObj.doStuff();
}
}
您只能从测试 class 的引用中调用现有方法。因此,如果您已经声明了 doStuff()
方法,那么您只能使用 Test testObj
引用来调用它。
看到这个 SO 问题 Is it possible to call subclasses' methods on a superclass object?
但是你肯定可以在匿名的其他方法声明中调用新方法 class。请参阅下面的示例。
示例:
public class Test {
public void doStuff() {
System.out.println("Test");
}
public static void main(String[] args) {
Test testObj = new Test() {
public void doStuff() {
System.out.println("Inside anonymous class doStuff");
doOtherStuff(); // calling new method doOtherStuff() and it works
}
public void doOtherStuff() {
System.out.println("Inside anonymous class doOtherStuff");
}
};
testObj.doStuff();
/*Below code give compilation error: The method doOtherStuff() is undefined for the type Test*/
// testObj.doOtherStuff();
}
}
输出:
Inside anonymous class doStuff
Inside anonymous class doOtherStuff
问题是匿名 class 没有 类型名称 (这就是它被称为匿名的原因)。
您将匿名 class 实例分配给类型 Test
的变量,并且 Test
类型没有名为 doStuff
.
因此您不能将匿名 class 实例分配给任何变量,然后在其上调用未在 superclass.
中定义的方法它 可以调用该方法,如果您不分配它:
public class Test {
public static void main(String[] args) {
new Test(){
public void doStuff(){
System.out.println("Test");
}
}.doStuff();
}
}
请注意,这在现实世界的 Java 程序中很少有用。
我只是展示这个来强调问题的根源:匿名 classes 当然可以拥有未在 superclass 中定义的方法,这是唯一的原因你不能轻易调用它们是因为 class 的类型是匿名的(没有名字)。但是它们仍然存在,可以直接在实例上调用。