如果匿名类正在扩展/实现一个类/接口,为什么不能添加新方法?

换句话说,这有效:

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()
}

最佳答案

在编译时,方法调用是基于调用它们的表达式的类型来确定的。在您的示例中,您尝试在b()类型的表达式上调用AA没有声明b()方法,因此它将不起作用。

它也不适用于您的具体B类示例

A notAnonA = new B();
notAnonA.b(); // fails to compile

您可以很好地在新的匿名类的主体内添加一个新方法,但是您只能在该类内或实际的新匿名类实例创建表达式上使用它。
new A() {
    void undeclared() {}
}.undeclared();

10-04 21:05