2012-12-11 5 views
5

Mam interfejs tak:Generics Java: dlaczego wewnętrzny interfejs nie może działać z poziomu (wewnętrznego) superinterface?

public interface SuperInterface { 
    public interface SubInterface { 
     public void get(); 
    } 
    //**More interfaces*/ 

} 

ta metoda w moim Toolkit, który pobiera wszystkie obiekty, które są przykładem pewnej klasy:

public static <T> ArrayList<T> getSome(ArrayList<Object> objects, Class<T> clazz) { 
    ArrayList<T> result = new ArrayList<T>(); 
    for (Object o : objects) 
     if (clazz.isInstance(o)) 
      result.add(clazz.cast(o)); 
    return result; 
} 

MojaKlasa nie jest naprawdę ciekawe, jego pusty klasa wykonawczych z SuperInterface.SubInterface

A ten kawałek w głównym:

ArrayList<Object> mObjects = new ArrayList<Object>() { 
    { 
     add(new MyClass()); //SuperInterface.SubInterface 
     add(Integer.valueOf(5)); 
     add(new String("Hello")); 
     add(new Object()); 
    } 
}; 
ArrayList<SuperInterface> mSuperInterfaces = Toolkit.getSome(mObjects, SuperInterface.class); //returns a zero-sized list. 
ArrayList<SuperInterface.SubInterface> mSubInterfaces = Toolkit.getSome(mObjects, SuperInterface.SubInterface.class); //returns a one-sized list 

Pierwsze wywołanie metody nie działa tak, jak miałem nadzieję, drugie wywołanie. Czy jest możliwe, aby pierwszy działał bez jawnego umieszczania podinterfejsów w innym pliku i implementacji nadklasy? Ponieważ widocznie Podinterfejsy nie są naprawdę Podinterfejsy, więc starałem się uczynić klasa Interfejs tak:

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub implements Super { /**...*/ } 
} 

Ale widocznie nie można używać implements w wewnętrzny interfejs.

Moje pytanie brzmi: Dlaczego to jest i czy istnieje sposób na osiągnięcie tego, co chcę osiągnąć (wewnętrzne interfejsy w jednym pliku)? Nie potrzebuję tego, chcę tylko wiedzieć, dlaczego nie jest możliwe implementowanie w wewnętrznych interfejsach (mimo to możliwe jest rozszerzanie klas wewnętrznych).

Odpowiedz

6

Ale najwyraźniej nie można używać implements w interfejsie wewnętrznym.

Szukacie extends zamiast implements:

public class ClassWithInterfaces { 
    public interface Super { } 
    public interface Sub extends Super { /**...*/ } 
} 

To kompiluje dla mnie, a ja na pewno można realizować oba interfejsy.

Ponieważ nie wydaje się być pewne zamieszanie wokół rozszerzenie vs wykonawczych, chyba dodaje pomoże jasne rzeczy:

  • interfejs rozciąga innego interfejsu.
  • Klasa implementuje interfejs.
  • Klasa rozszerza kolejną klasę.
+0

Od kiedy można rozszerzyć interfejs? Sądziłem, że słowa kluczowe implementują i rozciąga tam, gdzie można rozróżnić klasy abstrakcyjne i interfejsy? – stealthjong

+2

@ChristiaandeJong: Interfejs zawsze * rozszerza * inne interfejsy, nigdy * nie implementuje * ich. Tylko klasa może implementować rzeczy. – NPE

+0

Teraz, kiedy o tym wspomniałeś, jest to całkiem logiczne. Dziękuję bardzo. – stealthjong

1

Według specyfikacji języka Java:

Więc masz dwa powody, dla których nie można mieć "prawdziwe" wewnętrzne interfejsy

także , jak pisze NPE, interfejs nigdy nie może zaimplementować innego interfejsu, może go tylko rozszerzyć. Klasy mogą implementować interfejsy i/lub rozszerzać klasy, interfejsy mogą tylko rozszerzać interfejsy. Ma to dla mnie sens.

Powiązane problemy