为什么我不能在Java中调用添加到匿名类的方法?
问题描述:
如果一个匿名类正在扩展/实现一个类/接口,为什么我不能添加一个新的方法?为什么我不能在Java中调用添加到匿名类的方法?
换句话说,这个工程:
class A {
void a() {
System.out.println("a in A");
}
}
class B extends A {
@Override
void a() {
System.out.println("a in B");
}
void b() {
System.out.println("b in B");
}
}
为什么不这项工作:
class C {
A anonA() {
return new A() {
void b() {
System.out.println("b in C");
}
};
}
}
考虑:
public static void main(String[] args) {
B b = new B();
b.b();
// C c = new C();
// A anonA = c.anonA();
// anonA.b();
// yields: java: cannot find symbol \ symbol: method b()
}
答
方法调用,在编译时,确定基于它们被调用的表达式的类型。在你的例子中,你试图在A
类型的表达式上调用b()
。 A
未声明b()
方法,因此它不起作用。
它不会对你的具体B
类的例子工作,要么
A notAnonA = new B();
notAnonA.b(); // fails to compile
可以很好地添加新的方法新的匿名类的体内,但你只能内使用该类或实际的新的匿名类实例创建表达式。
new A() {
void undeclared() {}
}.undeclared();
您可以添加它们。你不能在匿名内部类之外调用它们。你会如何参考他们?它是什么类?它没有名字,没有参考。 – 2014-10-04 00:53:24
'anonA'引用的类型为'A',并且此类型没有'b()'方法。同样的,如果你声明'List list = new LinkedList ()''''list'',你将无法从'list'调用list.addFirst(“Foo”)'方法,因为'List'接口没有' addFirst'方法(即使此方法存在于“LinkedList”中)。 –
Pshemo
2014-10-04 01:00:49