为什么我不能调用添加到Java中的匿名类的方法?

时间:2014-10-04 00:51:40

标签: java java-7 anonymous-class

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

换句话说,这有效:

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

1 个答案:

答案 0 :(得分:9)

在编译时,方法调用是根据调用它们的表达式的类型确定的。在您的示例中,您尝试在类型为b()的表达式上调用AA未声明b()方法,因此无效。

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

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

你可以在新的匿名类的主体内添加一个新方法,但是你只能在类或实际的新匿名类实例创建表达式中使用它。

new A() {
    void undeclared() {}
}.undeclared();