generics, arrays, und das auch noch dynamisch! ;D
-
Hallo,
ich wollte mir (mal eben - wie naiv!) ein generische, dynamisches Array herzaubern.
Dass das nicht geht, wissen sicher alle, inzwischen auch ich.Solange die Datentypen primitiv - oder String - sind, gehts noch, darüber hinaus sind die Variablen leider Referenzen...
Ich scheiterte an folgendem Konstruktor:
public class DArray<T> { private T[] content; public DArray(T... source) { content = source.clone(); /** Bzw.: * content = (T[]) new Object[source.length]; * for(int i=0; i<source.length; i++) { * content[i] = source[i]; * } */ } }
Nun würde ich gerne ein dynamisches Array auf die Beine stellen (nein, ich will keine vorgefertigten Listen/etc. verwenden), wie kriege ich es hin, dass auch der Wert von source[i] übertragen wird? So
content[i] = new T(source[i]);
geht es ja nicht...
-
und wo ist jetz das problem? beide deiner lösungen funktionieren.
-
aha schrieb:
und wo ist jetz das problem? beide deiner lösungen funktionieren.
Ähm, seit wann funktioniert
(T[]) new Object[source.length];
oder
content[i] = new T(source[i]);
???
-
Aaalso - beides funktioniert auf primitiven Datentypen, das ist ja schön und gut. Nur hätte ich jetzt gerne ein paar Objekte selbstdefinierter Klassen gespeichert. Leider geht das nicht, weil ja nur die Referenzen kopiert werden, nicht der Inhalt... Der Inhalt lässt sich nicht kopieren, weil <T> keinen Kopierkonstruktor besitzt - leider...
-
Ähm, steht ich jetzt auf dem Schlauch?
(T[]) new Object[source.length];
Das wird beim Ausführen immer eine ClassCastException werfen. Und ich verstehe nicht, was du da mit primitiven Datentypen willst. Denn T darf gar kein int o.ä. sein.
Oder versteh ich dein Problem gerade nicht
-
LeGaN schrieb:
aha schrieb:
und wo ist jetz das problem? beide deiner lösungen funktionieren.
Ähm, seit wann funktioniert
(T[]) new Object[source.length];
oder
content[i] = new T(source[i]);
???
dass new T() blödsinn ist, ist klar. mit "beide lösungen" meinte ich
content = source.clone(); und
content = (T[]) new Object[source.length];
und die funktionieren beide problemlos.ne0r schrieb:
Aaalso - beides funktioniert auf primitiven Datentypen, das ist ja schön und gut.
beides funktioniert für jede klasse.
weil ja nur die Referenzen kopiert werden, nicht der Inhalt...
was ist bei deinem code auch anderes zu erwarten?
{quote]weil <T> keinen Kopierkonstruktor besitzt - leider... >.<[/quote]
so ein blödsinn, T ist nur eine typangabe, darum ist auch new T() schwachsinnig.
-
content = (T[]) new Object[source.length];
Da bekomm ich immer ne ClassCastException.
-
LeGaN schrieb:
content = (T[]) new Object[source.length];
Da bekomm ich immer ne ClassCastException.
da nicht
-
aha schrieb:
LeGaN schrieb:
content = (T[]) new Object[source.length];
Da bekomm ich immer ne ClassCastException.
da nicht
Autsch, du hast recht. Ich sollte mal besser alles lesen. Danke
-
Wieso willst du eine Kopie von dem Anlegen, was ich in einem Array speichern will?
meinContent = new Bar[100]; new FooArray(meinContent); // wieso sollte ich eine Kopie von // meinContent in den Array speichern wollen // und nicht einfach meinContent?
-
Ich möchte einfach gerne so was wie ArrayList (nach-)programmieren. Da würde ich halt gern so was wie
DArray<myType> dArray = new DArray(myObject1, myObject2, myObject3); dArray.add(myObject4); dArray.remove(0);
(etc...)
machen können.