2014-10-04 120 views
4

如果一个匿名类正在扩展/实现一个类/接口,为什么我不能添加一个新的方法?为什么我不能在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() 
} 
+5

您可以添加它们。你不能在匿名内部类之外调用它们。你会如何参考他们?它是什么类?它没有名字,没有参考。 – 2014-10-04 00:53:24

+0

'anonA'引用的类型为'A',并且此类型没有'b()'方法。同样的,如果你声明'List list = new LinkedList <>()''''list'',你将无法从'list'调用list.addFirst(“Foo”)'方法,因为'List'接口没有' addFirst'方法(即使此方法存在于“LinkedList”中)。 – Pshemo 2014-10-04 01:00:49

回答

9

方法调用,在编译时,确定基于它们被调用的表达式的类型。在你的例子中,你试图在A类型的表达式上调用b()A未声明b()方法,因此它不起作用。

它不会对你的具体B类的例子工作,要么

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

可以很好地添加新的方法新的匿名类的体内,但你只能内使用该类或实际的新的匿名类实例创建表达式。

new A() { 
    void undeclared() {} 
}.undeclared(); 
相关问题