| 

.NET C# Java Javascript Exception

1
Ich habe folgende Klassen:

public class BaseA{
//some Methods
}

und

public class DetailB extends BaseA{
public void doNothing();
}

Muss ich jetz durch alle Elemente einer List<BaseA> iterieren oder kann ich auch direkt casten?

So würde ich es machen, hoffe aber das es eine schönere Möglichkeit gibt.

List<BaseA> baseAList = getSomeContent();
List<DetailB> detailBList = new ArrayList<DetailB>();
for (BaseA baseA : baseAList)
detailBList.add((DetailB) baseA);
News:
26.07.2009
Leroy 315 2 5
3 Antworten
3
In die eine Richtung:
List <BaseA> baseAList = new ArrayList<BaseA>(detailBList);

in die andere Richtung:
List <DetailB> detailBList = Arrays.asList(baseAList.toArray(new DetailB[0]));

(auch nicht schön, aber geht)
03.08.2009
Fancy 424 1 2
2
Nach Lehrbuch sollte die Methode getSomeContent() bereits wissen, vom welchen Listen-Typ die Rückgabe ist. Dies kann man entweder dadurch erreichen, dass die Klasse dieser Methode einen Typparameter <T extends BaseA> besitzt, oder die Methode selbst, wenn sie statisch ist.

Also in der Art:

abstract class Provider<T extends BaseA> {
abstract List<T> getSomeContent();
}

class DetailProvider extends Provider<DetailB> {
List<DetailB> getSomeContent() {
return yourContentHere; //Todo:
}
}
08.09.2009
sml-ki 49 2
1
Hi,
erstmal setzt das natürlich voraus, das Deine baseAList nur Elemente vom Typ detailBList enthält. Wenn das sichergestellt ist, dann ergibt sich zwangsläufig die Frage warum die Methode getSomeContent() nicht gleich eine Liste dieses Typs zurückgibt.
Aber davon mal abgesehen ist der schnellste weg (weil ohne umkopieren) der unten gezeigte. Einfach eine Liste ohne Typisierung als "zwischenspeicher" nutzen.

List<BaseA> blist = new ArrayList<BaseA>(); // getSomeContent();
List tmp = blist;
List<DetailB> dlist = tmp;


(Das ist natürlich auch nicht schön, weil die Typsicherheit nicht garantiert wird. Zur Laufzeit kannst Du eine ClassCastException bekommen, wenn in der blist doch andere Elemente waren als welche vom Typ DetailB)
07.09.2009
keinhaar 210 2 6
1
Eine gute IDE (bspw. Eclipse, aber auch andere) zeigen solche Fehler bereits im Quellcode auf (gelb).
knalli 08.09.2009
1
Ja (siehe "nicht schön", und wenn man es entsprechend einstellt, dann auch als error (rot). Dennoch beantwortet das die Frage.
keinhaar 09.09.2009

Stelle deine Java-Frage jetzt!