2009-09-22 6 views
10

nehme ich eine Klasse implementieren, die eine Schnittstelle implementiert:Java-Liste von Objekten, die alle eine Schnittstelle

public class A implements IB 

und ich habe eine List<A>, die ich verweisen möchte: List<? implements IB> list. So dass ich code: for (IB item : list) usw.

Kann es irgendwie in Java getan werden? Es gibt keine <? implements ...> Möglichkeit. Was fehlt mir?

+1

Meinst du IA? wenn du IB sagst? – OscarRyz

Antwort

3

Wenn Sie diese Klasse A implementiert IA gemeint, sondern als IB, dann sollten Sie den Code einfach in Ordnung zu sagen

for (A item : list) { 
    // handle item as if it is an IA 
} 

seit alle As, per Definition IAs.

In der Zwischenzeit gibt es keinen Platzhalter für <? implements C>. Es gibt <? extends C>, und C kann eine Schnittstelle oder eine Klasse sein; Dies ist jedoch nicht notwendig für das, was Sie scheinbar zu tun versuchen.

Wenn Sie ausdrücklich for (IA item : list) sagen wollen, weil Sie garantiert nicht, dass Elemente in dieser Liste sind A s, sind aber garantiert, dass sie IA s, dann denke ich, Sie haben ein kleines Problem (ich kann nicht sagen, sicher, da Sie nicht gesagt haben, wo sich dieser Listenverarbeitungscode befindet). A List<A> ist nicht a List<IA> per Definition; Wenn Sie ein List<A> erstellen und es dann an eine Methode übergeben, die List<IA> erwartet, erhalten Sie einen Kompilierzeitfehler. Sie können jedoch eine List<IA> erstellen und sie mit A s füllen. Der Grund dafür ist in Javas Tutorial zu Generika erklärt.

+0

Was habe ich gedacht? Es funktioniert einwandfrei, denn in kann C auch eine Schnittstelle sein. Ich dachte "erweitert" <=> Vererbung. – Gerard

1

Nun, Sie könnten es zu einem List<IA> erklären.

Um darauf weiter aufzubauen, kann List alle Objekte speichern, die IA darin implementieren. Der Catch ist, dass, wenn Sie sie wieder herausholen, Sie die ursprüngliche Klasse nicht kennen, ohne eine .getClass() darauf zu tun.

Beispiel:

List<IA> list = new ArrayList<IA>(); 
// code to populate list here 
for (IA item : list) { 
    item.iaMethod(); 
} 
18

Verwendung extends:

public void someMethod(List<? extends IB> list) { 
    for (IB e : list) { 
    // Perform some processing on each element. 
    } 
} 

public void anotherMethod() { 
    List<A> list = new ArrayList<A>(); 
    someMethod(list); 
} 

Weitere Informationen finden Sie unter The Java Tutorials gefunden werden, die eine comprehensive lesson on Generics hat.

Insbesondere erklärt die section on wildcards wie die ? mit super und extends verwenden, um einen Parameter, um einen, die eine übergeordnete Klasse oder Unterklasse einer Klasse ist.

+0

Ich empfehle auch die Sitzung von Joshua Bloch von JavaOne dieses Jahr für weitere Informationen. Wirklich klar für mich: http: // Entwickler.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5217.pdf – amischiefr

+0

Danke für die Antwort. – Gerard

2

Sie können es mit extends:

List<? extends IA> list 
Verwandte Themen