2013-02-12 4 views
9

Я только что столкнулся с поведением, которое я сначала подумал, что это ошибка в Eclipse. Рассмотрим этот простой класс:Почему мой класс не реализует интерфейс, объявленный внутри него?

public class Foo { 
    public static interface Callback { 
     public void onAction(); 
    } 
} 

Это совершенно верно. Однако это не так:

public class Foo implements Callback { 
    public static interface Callback { 
     public void onAction(); 
    } 

    public void onAction() { /*some implementation*/ } 
} 

Но это справедливо, тоже:

public class Foo { 
    public static interface Callback { 
     public void onAction(); 
    } 

    private final Callback mCallback = new Callback() { 
     public void onAction() { /*some implementation*/ } 
    }; 
} 

Почему Java заставить меня своего рода «отходов» члена для него, если он может просто сохранить его позволив мне реализовать это сам? Я хорошо знаю об «обходном пути», чтобы поместить этот интерфейс в свой собственный файл, но из любопытства: есть ли причина, почему это не сработает?

+0

AFAIK, вы не можете создать новый интерфейс, поэтому новый Callback() недействителен –

+2

Я не уверен в официальном обосновании того, что это не работает, но я не вижу причин, почему вы хотели бы иметь класс реализует интерфейс, который он содержит - почему бы вам просто не определить класс с помощью методов, которые вы пытаетесь ввести в интерфейс? Зачем вам вообще нужен интерфейс? – iamnotmaynard

+2

@MiguelPrz он создает реализацию интерфейса inline с помощью '{}' – Miquel

ответ

6

В вашем втором случае, поскольку подписи проверяются перед телами классов, когда компилятор пытается скомпилировать класс Foo, интерфейс Callback еще не определен.

8

Используя этот код

public class Foo implements Callback{ 

public static interface Callback{ 
    public void onAction() 
} 

public void onAction(){//some implementation} 
} 

что Callback? Компилятор (btw, который отличается от Eclipse,) не знает, что такое Callback.

После того, как вы его использовали, вы определили интерфейс Callback.

+1

не может компилятор смотреть вперед и получить список всех классов?! чувствует себя глупо – NikkyD

Смежные вопросы