Ich habe eine Schnittstelle wie folgt aus:Java-Generics: Warum kann die innere Schnittstelle nicht von einer (inneren) Superschnittstelle implementiert werden?
public interface SuperInterface {
public interface SubInterface {
public void get();
}
//**More interfaces*/
}
diese Methode in meinem Toolkit, das alle Objekte abruft, die Instanz einer bestimmten Klasse sind:
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;
}
MyClass nicht wirklich interessant ist, dessen eine leere Klasse von SuperInterface.SubInterface
Implementierung
Und dieses Stück im Haupt:
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
Der erste Methodenaufruf funktioniert nicht wie ich gehofft habe, der zweite tut. Ist es möglich, dass der erste funktioniert, ohne die Subschnittstellen explizit in eine andere Datei zu setzen und die Superklasse zu implementieren? Da anscheinend die Subinterfaces sind nicht wirklich Subinterfaces, so habe ich versucht, die Interface-Klasse wie folgt zu machen:
public class ClassWithInterfaces {
public interface Super { }
public interface Sub implements Super { /**...*/ }
}
Aber anscheinend kann man nicht implements
in einer inneren Schnittstelle verwenden.
Meine Frage ist: Warum ist das, und gibt es eine Möglichkeit zu erreichen, was ich erreichen möchte (innere Schnittstellen in einer Datei)? Ich brauche es nicht unbedingt, ich möchte nur wissen, warum es nicht möglich ist, in inneren Schnittstellen zu implementieren (es ist jedoch möglich, innere Klassen zu erweitern).
Seit wann ist es möglich, von einer Schnittstelle zu erweitern? Ich dachte, die Schlüsselwörter implementiert und erweitert, wo es zwischen abstrakten Klassen und Schnittstellen zu unterscheiden? – stealthjong
@ChristiaandeJong: Eine Schnittstelle erweitert * immer * andere Schnittstellen, sie implementiert sie niemals *. Nur eine Klasse kann Dinge implementieren. – NPE
Nun, da Sie es erwähnen, ist es eigentlich ziemlich logisch. Vielen Dank. – stealthjong