PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Generics Problem


Monger
2005-07-16, 15:08:30
Und wieder mal ein Problem, diesmal mit Java Generics...

Ich bin grade dabei, alten Quellcode 5.0 konform aufzuarbeiten. Da bin ich auf folgendes Problem gestoßen:



public void eineMethode(Vector<Irgendwas> vector1){

Vector<Irgendwas> vector2 = vector1.clone();

// ...
}


An der Stelle wirft er mir eine Warnung aus. Wörtlich:

Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<Irgendwas>


Kann ich da irgendwas machen? Clone() gibt anscheinend nur eine untypisierte Collection zurück. Gibt es vielleicht doch einen Weg, das ganze typsicher zu machen?

HellHorse
2005-07-16, 16:50:53
1. Keine Vectors benutzen!!!!1111einself
2. Gegen List programmieren!!!!!1111einself

@Mods
Kann man das nicht sticky machen? Ich habe das Gefühl, das kommt immer noch jeden Monat, obwohl das seit 5 Jahren Allgemeinbildung sein sollte.

Zum eigentlichen Problem:
Ist zwar nur eine Warnung, das heisst es compiliert trotzdem, ist aber natürlich unschön. Du könntest den Eclipse compiler verwenden, der die SuppressWarnings Annotation unterstützt, aber das ist immer noch unschön.
Daher schlage ich vor eine neue List zu machen:

public void eineMethode(List<Irgendwas> list1){

List<Irgendwas> list2 = new ArrayList<Irgendwas>(list1);

// ...
}

Monger
2005-07-16, 19:09:52
1. Keine Vectors benutzen!!!!1111einself
2. Gegen List programmieren!!!!!1111einself


Warum nicht? Ich kann zwischen ArrayList und Vector keinen nennenswerten Unterschied feststellen - außer dass Vector bereits synchronisiert ist.

Und was meinst du mit "gegen List programmieren" ?
Mein Ziel ist, eine Reihe von Objekten zu sortieren, und will mir das "Comparable" Interface zu nutze machen. Deshalb ziehe ich aus dem Vector eine List raus, weil die sich sortieren lässt. Aber ich bin für bessere Alternativen jederzeit offen...


Btw, ich bin Programmieranfänger, sorry wenn die Frage hier schon öfters gestellt wurde! :(

HellHorse
2005-07-17, 11:28:58
Mein Ziel ist, eine Reihe von Objekten zu sortieren, und will mir das "Comparable" Interface zu nutze machen. Deshalb ziehe ich aus dem Vector eine List raus, weil die sich sortieren lässt. Aber ich bin für bessere Alternativen jederzeit offen...

Collections.sort (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html#sort(java.util.List)), ausser du hast einen _verdammt_ guten Grund dagagen. `Wollte mal eigenen Suchalgo implementieren' zählt nicht.
Zudem ist es grade in diesem Fall wichtig, gegen List zu programmieren damit du mehr als nur Vectors sortieren kannst (siehe weiter unten)

Warum nicht? Ich kann zwischen ArrayList und Vector keinen nennenswerten Unterschied feststellen - außer dass Vector bereits synchronisiert ist.
Problem erkannt. Jetzt schau mal auf die Versionsnummer von Vector und die des Collection Framework.
http://www.forum-3dcenter.org/vbulletin/showthread.php?t=202913 (ab post 8)


Und was meinst du mit "gegen List programmieren" ?
http://www.forum-3dcenter.org/vbulletin/showpost.php?p=2414563&postcount=9



Btw, ich bin Programmieranfänger, sorry wenn die Frage hier schon öfters gestellt wurde! :(
Schlule, FH, Uni oder self-made?

P.S.:
Wenn der Eindruck entsteht, es wurde schon öfter disktutiert, einfach mal SuFu mit "gegen List programmieren" resp. Vector anwerfen ;)

Gast
2005-07-17, 13:05:15
Erklär doch mal die Gründe warum man Vector nicht benutzen soll.

HellHorse
2005-07-17, 13:32:33
Erklär doch mal die Gründe warum man Vector nicht benutzen soll.
Siehe Post über dir, da gibt's einen Link zu einem Thread wo das distkutiert wurde, auch mit einem Gast.

Monger
2005-07-17, 22:46:56
Collections.sort (http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html#sort(java.util.List)), ausser du hast einen _verdammt_ guten Grund dagagen.

Zur Zeit mache ich es ja gerade mit Collections.sort(). Deshalb brauche ich ja eine Liste die ich sortieren kann.

Aber letztendlich ist das Hauptargument, dass ArrayList halt derzeit der Konvention entspricht, oder etwa nicht?


Schlule, FH, Uni oder self-made?

Nichts von alledem. Berufsakademie. Allerdings Pech mit den Dozenten gehabt, bis auf das letzte Jahr haben wir uns mehr mit allgemeiner Theorie als mit Praxis beschäftigt.
Und jetzt versuche ich, selber mich in Java ein bißchen fit zu machen.


Sehe ich das übrigens richtig, dass "clone()" keinen sinnvollen Zweck mehr erfüllt? Weil ich sehe weder da noch dort, dass clone irgendwas typisiertes zurückgeben würde...

Edit:
Nochwas. Hier spuckt er mir auch eine Warnung aus:

Collections.sort(liste);

hier dagegen nicht:

Collections.sort(newKlassement,Collections.reverseOrder());

Warum?
"liste" ist übrigens deklariert als "List<Typ> liste"

HellHorse
2005-07-18, 00:06:18
Zur Zeit mache ich es ja gerade mit Collections.sort(). Deshalb brauche ich ja eine Liste die ich sortieren kann.
*hust*, Vector implementiert List

Aber letztendlich ist das Hauptargument, dass ArrayList halt derzeit der Konvention entspricht, oder etwa nicht?
ArrayList (resp. LinkedList) hat mit Java 1.2 Vector abgelöst. Die Verwendung von Vector ist im Allgemeinen Zeichen eines veralteten Lehrbuches, resp. dass man in den letzten 5 Jahren unter einem Stein gelebt hat. Nicht gerade der Eindruck, den man normalerweise erwecken will.

Sehe ich das übrigens richtig, dass "clone()" keinen sinnvollen Zweck mehr erfüllt? Weil ich sehe weder da noch dort, dass clone irgendwas typisiertes zurückgeben würde...
Ich habe #clone noch nie verwendet. Einerseits nerven CloneNotSupportedException und der cast, anderseits musst du wissen ob der Entwickler sich die Mühe gemacht hat, es richtig zu implementieren. Mittlerweile hat man covariante Rückgabetyen da könnte man es gescheit implentieren, hat aber noch niemand gemacht. Neue Liste machen ist der wesentlich einfachere Weg. Ideal wäre so was wie #copyFrom:to: in List, aber eben.

Edit:
Nochwas. Hier spuckt er mir auch eine Warnung aus:

Collections.sort(liste);

Warum?
Wie sieht die denn aus?

Monger
2005-07-18, 14:06:52
Wie sieht die denn aus?

Das selbe Spielchen wie vorher: ich krieg eine Warnung, dass der Übergabeparameter nicht sicher ist, weil er nicht ausreichend typisiert ist.
Zu Hause schau ich nochmal nach, aber ich fürchte, es liegt an der Art wie ich compareTo(...) implementiert habe...

Da ist ja nunmal gar nix typisiert. Das erklärt zwar nicht, wieso das eine mal funktioniert, und das andere nicht, aber es dürfte wohl ein Grund sein...

Wie muss denn das Objekt aussehen? Was fehlt an folgendem Quellcode?



public class Thingy implements Comparable<Thingy>{

public int compareTo(Thingy o){
// Implementierung ...
}
}




Edit: selber denken macht schlau. Habs inzwischen herausgefunden, und obigen Code vervollständigt.