# Vector mit beliebigen Klassen an Funktion übergeben



## Samarek (16. Dez 2011)

Hallo,

ich bin mir nicht ganz sicher ob das wirklich ein Anfänger Thema ist und ich glaub so ganz klar ist aus dem Titel auch nicht was ich will, aber ich erläuter es ja jetzt sowieso.

Also ...

Ich möchte eine Funktion schreiben der ich einen Vektor übergeben kann der verschiedene Klassen enthalten kann.
Die Aufrufe sollen so aussehen:
[Java]
Vector<EigeneKlasse1> alles = new Vector<EigeneKlasse1>();
funktion(alles);
[/Java]
und ...
[Java]
Vector<EigeneKlasse2> alles = new Vector<EigeneKlasse2>();
funktion(alles);
[/Java]
und ...
[Java]
Vector<Basisklasse> alles = new Vector<Basisklasse>();
funktion(alles);
[/Java]

Wie muss dazu jetzt die Funktionssignatur aussehen?
[Java]
public void funktion(Vector<???> alles)
{
 ...
}
[/Java]


----------



## ARadauer (16. Dez 2011)

erben EigeneKlasse2 und EigeneKlasse1 von Basisklasse?

public void funktion(Vector<? extends Basisklasse> alles)


----------



## Samarek (16. Dez 2011)

Nee, sorry, das war da wohl etwas irreführend benannt.

Die Klassen müssen(!!!) völlig unabhängig voneinander seien können.


----------



## AngryDeveloper (16. Dez 2011)

Dann nur mit Vector<?>.


----------



## bygones (16. Dez 2011)

AngryDeveloper hat gesagt.:


> Dann nur mit Vector<?>.


dann kann man nur mit Object arbeiten ...

die Frage ist, wenn sie so gar nix miteinander zu tun haben, warum willst du dann sie in eine Methode pressen und vor allem - was soll diese Methode machen ?


----------



## AngryDeveloper (16. Dez 2011)

Schon klar. Bin davon ausgegangen er würde das so wollen (warum auch immer).
Vielleicht soll die Methode einfach nur sysout auf die Objects ausführen. :bahnhof:
Alternativ lauter instanceof (please no).

Edit:
Mehr Informationen wären also nicht schlecht, was du (TO) eigentlich machen möchtest.


----------



## Samarek (16. Dez 2011)

ah ... sehr nice
danke


----------



## irgendjemand (16. Dez 2011)

ist das ganze nicht wegen TYPE-EREASURE sowieso egal ?
ich mein : der einzige der meckert ist der compiler ... zur sicherheit sollte man die methoden doch eh immer mit instanceof vollstopfen um runtime-fehler zu vermeiden ...


----------



## bygones (16. Dez 2011)

irgendjemand hat gesagt.:


> ist das ganze nicht wegen TYPE-EREASURE sowieso egal ?
> ich mein : der einzige der meckert ist der compiler ... zur sicherheit sollte man die methoden doch eh immer mit instanceof vollstopfen um runtime-fehler zu vermeiden ...



sollte man nicht - wenn man anfaengt seine methode mit instanceofs vollzustopfen ist ein grundlegender fehler im Design. Man versucht irgendwas zusammenzupressen, was nicht zusammengehoert.


----------



## irgendjemand (16. Dez 2011)

ist eigentlich genau die antwort die ich wollte ...

sollte TO lediglich zeigen das es wenig sinn macht klassen die überhaupt nichts mit ein ander zu tun haben in einer methode zu verarbeiten und diese dann mit instanceof vollzukrachen nur um dann aus der List die einzelnen klassen wieder zu trennen ...


----------



## Samarek (16. Dez 2011)

Ich versteh nicht ganz was ihr da grad redet, könnte aber auch an meinem aktuellen müdigkeitszustand liegen (gestern war Betriebsweihnachtsfeier).

Wie dem auch sei, ich feil da grad noch ein wenig dran rum und dann poste ich das Mini-Tool sowieso, dann könnt ihr euch das selber alles angucken und dran rumwerken und mir Feedback geben.


----------



## Evil-Devil (16. Dez 2011)

Ich bin mir gerade nicht sicher, aber konnte man Generics nicht auch mit Interfaces nutzen? Also einfach das Interface als Typ übergeben.


----------



## irgendjemand (16. Dez 2011)

worüber wir uns hier gerade gedanken machen ist der punkt das es ein schlechtes design ist und auch wenig sinn macht wenn du objekte unterschiedlicher klassen die überhaupt nichts mit ein ander zu tun haben *also nicht mal eine gemeinsame basis-klasse haben oder kein gemeinsames interface implementieren* in einen Vector *oder sonstige List* zu stecken und diesen dann einer methode zu übergeben die vollgekracht ist mit instanceof - abfragen um dann klassen-spezifische dinge umzusetzen ...

mal ne gegenfrage : wofür brauchst du das überhaupt ?


----------



## AngryDeveloper (16. Dez 2011)

Evil-Devil hat gesagt.:


> Ich bin mir gerade nicht sicher, aber konnte man Generics nicht auch mit Interfaces nutzen? Also einfach das Interface als Typ übergeben.


Jo, mit Interfaces geht es auch.


----------



## Evil-Devil (16. Dez 2011)

AngryDeveloper hat gesagt.:


> Jo, mit Interfaces geht es auch.



Ah gut. Dann bräuchte der TE lediglich ein Interface das alle seine beliebigen Klassen nutzen.


----------



## irgendjemand (16. Dez 2011)

ich find eure ansätze in richtung OOP und interfaces ja sehr gut ... ABER

zitat TO


> Die Klassen müssen(!!!) völlig unabhängig voneinander seien können



ergo : TO kann / will hier keine interfaces nutzen ...


----------



## TheWhiteShadow (16. Dez 2011)

Ich würde als Lösung folgendes vorschlagen:

```
Vector<? extends Basisklasse>
```
Damit bleiben die Methoden der Basisklasse ohne Cast und Typsicher verfügbar.


```
Vector<?>
```
 entspricht: 
	
	
	
	





```
Vector<? extends Object>
```
So bleiben nur Object-Methoden über.


----------



## bygones (16. Dez 2011)

TheWhiteShadow hat gesagt.:


> Ich würde als Lösung folgendes vorschlagen:
> 
> ```
> Vector<? extends Basisklasse>
> ...



lies die beitrage ueber dir ;-)


----------



## Samarek (16. Dez 2011)

> mal ne gegenfrage : wofür brauchst du das überhaupt ?



Der Vector soll keine Objekte verschiedener Klassen enthalten, dass das Quatsch ist ist mir auch klar.
Die Funktion soll verschiedene Vektoren akzeptieren die jeweils unterschiedliche Objekte einer Klasse enthalten.

so dass ich der Funktion halt Vector<Baum>, Vector<Auto> oder Vector<Friteuse> übergeben kann.

... und das ganze ist auch schon seit einigen Posts gelöst, mit funktion(Vector<?> alles) ging es

... und ja, die Methode soll in der Tat nur JSONs daraus bauen, nix spezifischeres, also wenn dass alles Objects sind ist das völlig in Ordnung


----------



## Gregorrr (16. Dez 2011)

Samarek hat gesagt.:


> Der Vector soll keine Objekte verschiedener Klassen enthalten, dass das Quatsch ist ist mir auch klar.
> Die Funktion soll verschiedene Vektoren akzeptieren die jeweils unterschiedliche Objekte einer Klasse enthalten.
> 
> so dass ich der Funktion halt Vector<Baum>, Vector<Auto> oder Vector<Friteuse> übergeben kann.
> ...



Genau das ist die Anwendung der Bivarianz (also der Generic Wildcard ?), wenn die darunter liegenden Objektinstanzen keine Rolle spielen, es aber auf die Struktur der Containerklassen ankommt.

Fälschlicherweise (nach alter C-Manier) wird oft instanceof benutzt und zurückgecastet, aber das ist nicht Java, dann stimmt, wie schon oben aufgeführt etwas am Design nicht, weil es ja auf die Objektinstanzen der Container ankommt.


----------



## Samarek (19. Dez 2011)

So, wie angekündigt ist hier mal ein Link zu dem Projekt

http://dl.dropbox.com/u/53574637/Testtool.rar

Der Grundgedanke war hier eine kleine Oberfläche zu haben mit der sich Daten verarbeiten lassen,
im Sinne von ...
Daten aus einer JSON in SQL-Befehle umwandeln oder ...
bestimmte Objekte als JSON abspeichern oder ...
um diverse Algorithmen zu testen, halt verschiedene Werte eingeben und sich dann eine Ausgabe anzeigen lassen oder ...
für was auch immer man es sonst noch brauchen kann.

das Ganze ist als Entwickler-Tool gedacht, so dass halt die genauen Algorithmen dann immer implementiert werden müssen.
Mir war es soweit schonmal in diversen Situationen recht nützlich, ich hoffe dass es auch anderen so geht.

Fühlt euch frei es zu verändern, zu erweitern oder was auch immer damit anzustellen, ich freu mich auch immer über Rückmeldungen, Email Adresse steckt im Programm


----------

