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).
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
@ChristiaandeJong: Interfejs zawsze * rozszerza * inne interfejsy, nigdy * nie implementuje * ich. Tylko klasa może implementować rzeczy. – NPE
Teraz, kiedy o tym wspomniałeś, jest to całkiem logiczne. Dziękuję bardzo. – stealthjong