2014-10-04 2 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

Вы можете добавить их. Вы просто не можете назвать их вне анонимного внутреннего класса. Как бы вы ссылались на них? Какой класс? У него нет имени, нет ссылки. –

+0

Ссылка 'anonA' имеет тип' A', и этот тип не имеет метода 'b()'. Аналогично, если вы объявите «Список list = new LinkedList <>()', вы не сможете вызывать 'list.addFirst (« Foo »)' метод из 'list', потому что интерфейс' List' не имеет ' addFirst' (даже если этот метод присутствует в 'LinkedList'). – Pshemo

ответ

9

вызовы метода, во время компиляции, определяются основанные на типе выражения, на которое они вызывают. В вашем примере вы пытаетесь вызвать b() на выражение типа A. A не объявляет метод b(), поэтому он не будет работать.

Это не работает на вашем конкретном примере B класса либо

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

Вы можете очень хорошо добавить новый метод в теле нового анонимного класса, но вы будете в состоянии использовать его в класс или фактическое новое выражение создания экземпляра анонимного класса.

new A() { 
    void undeclared() {} 
}.undeclared(); 
Смежные вопросы