[英]Why can't I create a new method in an anonymous inner class?
如果我有以下课程:
public class TestObject {
public String Hooray() {
return "Hooray!";
}
}
我显然可以实例化该对象,并且我知道必须进行某种子类化,因为我可以覆盖Hooray方法,但是如果有子类化,为什么我不能在匿名类内部创建一个新方法?
TestObject a = new TestObject() {
public String Boo() {
return "Booooo";
}
};
System.out.println(a.Boo());
返回语法错误
您可以创建该方法,您的Boo
方法没有任何问题(除了它的前面有一个大写字母之外)。 问题在于,在匿名类之外,Boo方法不可用(它没有作为类API的一部分公开)。
这与实现接口的任何类都是相同的...如果该类具有不属于接口的方法(甚至是公共方法),则您需要将实例转换为特定的类才能访问这些方法。
不幸的是,因为这是一个匿名类,所以您不能将其强制转换(您不知道将其强制转换为什么)。
这些内部方法仍然有用,但是您必须从匿名类内部而不是外部调用它们。
因为该类没有名称,所以您不能在编译时引用其类型定义。 编译器只能将其视为TestObject,而没有boo()方法
你有这个:
public class TestObject {
public String Hooray() {
return "Hooray!";
}
}
TestObject a = new TestObject() {
public String Boo() {
return "Booooo";
}
}
System.out.println(a.Boo());
你做不到 您实际上可以在匿名内部类中创建新方法。 但是您将无法从外部调用a.Boo()
,因为a
是TestObject
而TestObject
没有名为Boo
方法。 这是您无法执行此操作的相同原因:
public class Base {
public void something ();
}
public class Derived extends Base {
public void another ();
}
Base b = new Derived();
b.another(); // b is a Base, it must be cast to a Derived to call another().
在上面,您必须将b
Derived
转换为Derived
以调用添加到派生类的新方法:
((Derived)b).another();
您无法使用匿名内部类(它们只是派生新子类的语法捷径)无法执行此操作的原因,恰恰是因为它们是匿名的-您无法将其强制转换为任何类型。
顺便说一下,您无法通过Base
类型访问another()
的原因非常简单。 而Derived
为Base
,编译器无法知道的方式Base b
是持有Derived
相对于一些其他子类Base
不具有another()
方法。
希望能有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.