Ik vroeg me af of er een handige manier is, om een Container-object (een Vector bijvoorbeeld) met daarin een aantal objecten van een specifiek type, om te zetten naar een array van dat specifieke type.
De situatie waarin ik tegen dit probleem aanloop, is waarin ik een configuratiebestand inlees en (simpel gezegd) per regel een object aan wil maken. Omdat ik van te voren niet weet hoeveel objecten er gaan komen, voeg ik ze uiteraard toe aan een Container-object (een Vector, meer specifiek). Ik moet de resulterende verzameling van objecten echter doorgeven aan een constructor die een array van die objecten verwacht. Hoe doe ik dat op een handige, efficiënte en leesbare manier?
Mijn probleem wordt geïllustreert door de volgende code:
De cast naar Test[] gooit een ClassCastException, aangezien toArray() een resultaat van het type Object[] oplevert. De hierarchy van Java array-typen is covariant met de typen die in de arrays zitten (dat wil zeggen: X[] is een subtype van Y[] (uitsluitend) wanneer X een subtype van Y is), dus het lijkt me niet onlogisch dat het type van een array naar een beperkter type gecast kan worden, wanneer dat dat met het type dat er in zit kan. Mocht dit at-runtime niet blijken te kunnen (wat in mijn geval gegarandeerd niet voorkomt) dan zou er een soort variatie op de bestaande ArrayStoreException gegooit kunnen worden.
Ik kon echter met mijn beschikbare Java-kennis en Google geen geschikte constructie vinden, om dit te doen. Mijn work-around is het construeren van een nieuwe array en het gebruik van een for-lusje om de boel heen en weer te kopiëren. Zo dus:
Maar dit is uiteraard erg inefficient en slecht leesbaar bovendien. Heeft iemand een beter idee? Of is dit het best haalbare? De bestaande constructor die een array verwacht wijzigen wil ik niet, omdat de type safety die de array nu garandeerd dan komt te vervallen (een Collection, Iterator of Enumerator kan alleen Objecten opleveren) en bovendien is dit geen algemene oplossing.
De situatie waarin ik tegen dit probleem aanloop, is waarin ik een configuratiebestand inlees en (simpel gezegd) per regel een object aan wil maken. Omdat ik van te voren niet weet hoeveel objecten er gaan komen, voeg ik ze uiteraard toe aan een Container-object (een Vector, meer specifiek). Ik moet de resulterende verzameling van objecten echter doorgeven aan een constructor die een array van die objecten verwacht. Hoe doe ik dat op een handige, efficiënte en leesbare manier?
Mijn probleem wordt geïllustreert door de volgende code:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| import java.util.Vector; public class Test { public static void main() { Vector vector = new Vector(); vector.add(new Test()); vector.add(new Test()); vector.add(new Test()); Test[] array = (Test[])vector.toArray(); // mag niet! } } |
De cast naar Test[] gooit een ClassCastException, aangezien toArray() een resultaat van het type Object[] oplevert. De hierarchy van Java array-typen is covariant met de typen die in de arrays zitten (dat wil zeggen: X[] is een subtype van Y[] (uitsluitend) wanneer X een subtype van Y is), dus het lijkt me niet onlogisch dat het type van een array naar een beperkter type gecast kan worden, wanneer dat dat met het type dat er in zit kan. Mocht dit at-runtime niet blijken te kunnen (wat in mijn geval gegarandeerd niet voorkomt) dan zou er een soort variatie op de bestaande ArrayStoreException gegooit kunnen worden.
Ik kon echter met mijn beschikbare Java-kennis en Google geen geschikte constructie vinden, om dit te doen. Mijn work-around is het construeren van een nieuwe array en het gebruik van een for-lusje om de boel heen en weer te kopiëren. Zo dus:
Java:
1
2
3
| Test[] array = new Test(vector.size()); for(int n = 0; n < array.length; ++n) array[n] = (Test)vector.get(n); |
Maar dit is uiteraard erg inefficient en slecht leesbaar bovendien. Heeft iemand een beter idee? Of is dit het best haalbare? De bestaande constructor die een array verwacht wijzigen wil ik niet, omdat de type safety die de array nu garandeerd dan komt te vervallen (een Collection, Iterator of Enumerator kan alleen Objecten opleveren) en bovendien is dit geen algemene oplossing.