2014-10-04 59 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(); 
相關問題