Liste mit verschiedenden Objekten

Status
Nicht offen für weitere Antworten.

SmartGuy

Mitglied
Hallo Leute,

hab folgendes Problem in Bezug auf Listen und Typen der Listen:

Java:
List<List<List<? extends Number>>> liste = null;

List<List<? extends Number>> liste_mit_integerwerten = (List<List<? extends Number>>) getInput("input_integerListe");
liste.add(liste_mit_integerwerten);

List<List<? extends Number>> liste_mit_doublewerten = (List<List<? extends Number>>) getInput("input_doubleListe");
liste.add(liste_mit_doublewerten);

usw...

Nun kann ich aber nicht auf die Methoden von Integer bzw. Double zugreifen. Ist das so, weil ich die auf Number parse?

Wenn ich
Java:
List<List<Integer>> liste_mit_integerwerten = (List<List<Integer>>) getInput("input_integerListe");
liste.add(liste_mit_integerwerten);
Machen würde, kommt bei liste.add(liste_mit_integerwerten) folgender Fehler:

The method add(List<List<? extends Number>>) in the type List<List<List<? extends Number>>> is not applicable for the arguments (List<List<Integer>>)

Wie krieg ich Listen mit verschiedenen Typen in eine gemeinsame Liste und kann immernoch auf die Typenmethoden zugreifen????:L
 

Der Müde Joe

Top Contributor
>Wie krieg ich Listen mit verschiedenen Typen in eine gemeinsame Liste und kann immernoch auf die Typenmethoden zugreifen?

Gar nicht mit generics. Ausser du machst beim raushohlen eine instanceof und ein cast (hässlich)
 
B

bygones

Gast
auch hier frage ich mich [c]List<List<List<? extends Number>>> liste[/c] was ist der sinn einer Liste einer Liste einer Liste ?

Java ist OO... warum nutzt das keiner ?
 
S

SlaterB

Gast
> Wie krieg ich Listen mit verschiedenen Typen in eine gemeinsame Liste und kann immernoch auf die Typenmethoden zugreifen?

gar nicht, außer die enthaltenen Objekte wieder auf ihren Typ zu casten,
eine Liste kann nur eine Art Objekt enthalten, wie sollte man auch je nach Index unterscheiden
-----

(List<List<Integer>>) getInput("input_integerListe");

ein Cast brauch nie generisch sein, das bringt gar nix, das wird zur Laufzeit eh nicht mehr geprüft, schreibe
(List) getInput("input_integerListe");
das macht exakt dasselbe

--------

> kommt bei liste.add(liste_mit_integerwerten) folgender Fehler:

das ist ein wichtiger Fehler, den man an einem etwas einfacheren Beispiel besser sieht:
Java:
public class Test {

	public static void main(String[] args) {
		List<Double> x = new ArrayList<Double>();

		List<? extends Number> l = x;

		Integer i = Integer.valueOf(4);
//		l.add(i);  zum Glück typsicher verboten
		List ll = l;
		ll.add(i); // hier nicht mehr vom Compiler verhindert

		Double d = x.get(0); 
		// -> ClassCastException, ein böser Integer ist in die Liste gekommen
		System.out.println(d);
	}
}

? extends Number heißt, dass irgendein unbestimmter Typ X vorhanden ist,
get() funktioniert bei so einer Liste, get liefert Number, denn egal welcher Typ X ist, die Objekte werden auf Number castbar sein,

add() muss aber ausgeschlossen sein, weder Double, noch Integer noch Number selber als Parameter ist erlaubt,
denn X kann immer irgendein Typ sein, der mit irgendeinem Paramterer nicht hinhaut, add() ist stillgelegt
 

Marco13

Top Contributor
Ein paar Einträge über und unter diesem Eintrag liefern einen Haufen Information dazu.
AngelikaLanger.com - Java Generics FAQs - Under The Hood Of The Compiler - Angelika Langer Training/Consulting
Sollte man sich mal durchlesen. Hab' ich inzwischen schon ein paar mal, muss aber zugeben, dass ich, wenn es um solche Fragen geht (speziell bei so ... grenzwertig .. tief verschachtelten Generics) meistens dazu übergehe, so lange "? extends" an verschiedenen Stellen einzufügen, bis der Compiler sich nicht mehr beschwert.

So auch in diesem Fall: Mit einer [c]List<List<? extends List<? extends Number>>> liste[/c] geht's.

Die Antwort auf die Frage, warum sowas wie das andere nicht geht, ist in erster Näherung praktisch IMMER die gleiche: Weil es nicht Typsicher ist. Wenn nötig kann ich mal versuchen, den Fall rauzufiltern, bei dem es mit einer [c]List<List<List<? extends Number>>> liste[/c] irgendwann krachen könnte...
 

SmartGuy

Mitglied
auch hier frage ich mich [c]List<List<List<? extends Number>>> liste[/c] was ist der sinn einer Liste einer Liste einer Liste ?

Java ist OO... warum nutzt das keiner ?

Vielleicht weil nicht jeder die Möglichkeiten in einer bestimmten Entwicklungsumgebung für ein bestimmtes Projekt hat. Leider ist das bei meiner Aufgabe mit den vorgegebenen Bedingungen nicht möglich. ;)
Kann weder Klassen erstellen, noch von welchen Erben. Kann nur in einer Klasse den SourceCode in einer Methode ändern :( und da muss man sich nunmal beschränken und es so hässlich machen.


@SlaterB:
Danke für die konstruktive Antwort.
Hatte es auch zunächst so gelöst, dass ich jedes Objekt wieder zurück caste. Das kam mir dann allerdings ein bisschen zu umständlich für Java vor und hab gehofft, da gibts nen Trick.

Also gehts nur auf die "Dirty"-Weise :D ??
 
S

SlaterB

Gast
was du genau haben willst ist eh nicht ganz klar,
schreibe doch mal dein Programm so wie du es willst

Liste l = ..;
l.add(x);
l.add(y);
X x = l.get(0);
Y y = l.get(1);

wird aber garantiert nicht gehen, weder in Java noch sonst einer allgemeinen Programmiersprache (falls man nicht auf Typprüfung ganz verzichtet),
jedenfalls nicht mit einem so allgemeinen Ding wie einer Liste in einem beliebigen Programmfluss,
eine Code-Zeile wie
X x = l.get(0);
muss da für sich betrachtet werden, der Inhalt von l kann ganz beliebig sein,
auf keine Weise kann ein Computer garantieren, dass l an Position 0 ein x hat, falls nicht der Typ X für die ganze Liste vorgegeben ist
 

Nader

Mitglied
Wie krieg ich Listen mit verschiedenen Typen in eine gemeinsame Liste und kann immernoch auf die Typenmethoden zugreifen????:L

indem du eigene Listenklassen mit bestimmen Boundary implementierst:

Java:
class IntegerList implements List<Integer> {
}

class DoubleList implements List<Double> {
}

deine verkettete Liste beinhaltet nur solche typisierte Listen.
 

Marco13

Top Contributor
Ich hatte das jetzt so verstanden, dass es NUR darum geht, sowas machen zu können wie
Code:
List<List<Integer>> liste_mit_integerwerten = (List<List<Integer>>) getInput("input_integerListe");
liste.add(liste_mit_integerwerten);
und DANACH über die schon bekannte Referenz "liste_mit_integerwerten" noch sowas machen zu können wie
Code:
Integer i = integerwerten.get(1);

Um das casten bei getInput kommt man nicht drumrum, und um ein Casten, wenn man die Daten am Ende aus der List<List<List<List<List...>>>> rausholt, auch nicht. Aber man kann die List<List<List<List<...>>>> zu einer List<List<List<? extends List<...>>>> machen, und damit warnungsfrei die schon vorhandenen Objekte in die Liste legen...
 

hdi

Top Contributor
Was du jetzt natürlich machen kannst ist dir da ne eigenen Hierarchie zusammenbasteln, und dann für den Zugriff zB das Strategy Pattern verwenden. Oder falls das ganze nicht so dynamisch sein muss (Typen können sich nicht ändern), dann reichen auch abstrakte Klassen, oder besser noch ein Interface:

Java:
interface MySuperType{
   public void doStuff();
}

class MyInteger extends Integer implements MySuperType{
  @Override public void doStuff(){
         System.out.println("doing stuff on an integer, perhaps using my inherited class Integer");
  }
}

class MyDouble extends Double implements MySuperType{
   @Override public void doStuff(){
         System.out.println("doing stuff on a double, perhaps using my inherited class Double");
  }
}

// main()
List<MySuperType> list = new ArrayList<MySuperType>();
list.add(new MyInteger());
list.add(new MyDouble());

for(MySuperType s : list){  
   s.doStuff();
}

edit: Also zur Erklärung:
Wie krieg ich Listen mit verschiedenen Typen in eine gemeinsame Liste und kann immernoch auf die Typenmethoden zugreifen?

In dem du ihnen eine Pseudo-Gemeinsamkeit schaffst, hier durch das Interface. Du kannst jetzt im Interface alle möglichen Methoden definieren, du die evtl auf deinen Objekten aufrufen willst.
D.h. du könntest im Interface jetzt alle Methoden der Klasse Double und Integer definieren, und die Klasse MyDouble implementiert all die Double-Methoden durch Delegation:

Java:
// vom Interface:
@Override
public void aDoubleMethod(){ 
   super.aDoubleMethod(); // führt den Code der geerbten Klasse Double aus
}

und alle Integer-Klassen einfach als No-Ops:

Java:
// vom Interface:
@Override
public void anIntegerMethod(){ 
   ; // do nothing
}

Bei MyInteger dann halt andersrum.. Die Frage ist inwiefern du das wirklich bei deinem Vorhaben anweden kannst, denn du kannst jetzt nicht sicher sein ob irgendwas "funktioniert" hat, wenn du zB eine Integer-Methode auf eines deiner SuperType-Objekte aufrufst. Evtl war es ein MyDouble und hat damit nix getan. Du kannst natürlich statt den No-Ops eine Exception werfen, und dann darauf reagieren. Aber das ähnelt auch schon wieder einer instanceof Prüfung oder einem if-else.
 
Zuletzt bearbeitet:

SmartGuy

Mitglied
Nochmal zum Verständnis:
In einer Liste "gesamt" sind Listen mit Objekte verschiedener Typen. Also eine Liste "i" vom Typ Integer und eine Liste "d" vom Typ Double.

Ich möchte beide Listen (i und d) in die Liste "gesamt" reinpacken, dann aber über die "gesamt"-liste auf die Methoden zugreifen können, die für die jeweiligen Typen definiert sind.

z. B.
Java:
List <List<? extends Number>> gesamt = new LinkedList<List<? extends Number>>();
List<Integer> i = new LinkedList<Integer>();
List<Double> d = new LinkedList <Double>();

gesamt.add(i);
gesamt.add(d);
gesamt.get(0).get(0).parseInt(irgendeinString);

ich kann aber nicht auf .parseInt() zugreifen, weil es ja kein Typ mehr vom Integer ist.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
der Computer weiß nur, dass Number in der Liste ist,
wenn du weißt, dass es Integer ist, dann kannst du ja casten, anders gehts nicht,
 

Marco13

Top Contributor
@hdi: So eine Gemeinsamkeit gibt's schon - die heißt "Number" :D

@SmartGuy: Ja, das geht nicht. An dem Punkt
[c]gesamt.get(0)....[/c]
weiß man nicht mehr, ob man dort eine List<Integer> oder eine List<Double> bekommt - man weiß nur, dass das, was da drin ist, eine "Number" ist. Was genau willst du denn mit dem Objekten (in den Unterlisten, hier als den Integer- oder Double-Objekten) machen? parseInt ist ja ohnehin statisch, und sowas wie intValue oder doubleValue wird von Number ja angeboten. Es gibt ja kaum (fast keine ???:L ) Methoden, die spezifisch für Integer oder Double sind...
 

SmartGuy

Mitglied
Ich hab das nur als Beispiel genommen. Aber ich mein vom Prinzip her dasselbe. Gibt es keine Möglichkeit, herauszufinden, was für eine Number das ist und dann deren Methoden aufzurufen?
 

Nader

Mitglied
man könnte zwar folgendes machen (trotz Type safety), müsste aber beim Zugriff auf Gesamtliste immer genau wissen, welcher Typ unter welcher Index abgelegt ist.

Java:
private void test() {
	List<MyList> gesamt = new ArrayList<MyList>();
	IntegerList iList = new IntegerList();
	DoubleList dList = new DoubleList();
	gesamt.add(iList);
	gesamt.add(dList);

	Integer i = gesamt.get(0).getAt(0);
}

interface MyList {
	<T> T getAt(int index);
}

class IntegerList extends ArrayList<Integer> implements MyList {
	public Integer getAt(int index) {
		return get(index);
	}
}

class DoubleList extends ArrayList<Double> implements MyList {
	public Double getAt(int index) {
		return get(index);
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
B Liste ändern während Iteration über Diese? Allgemeine Java-Themen 16
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
K verkettete Liste Allgemeine Java-Themen 3
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
A Auswählbare Liste Allgemeine Java-Themen 2
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
N Liste gesucht Allgemeine Java-Themen 2
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
O JSON String bauen aus Liste Allgemeine Java-Themen 2
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
pg1337 Liste füllen Allgemeine Java-Themen 2
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
B Properties File Liste Allgemeine Java-Themen 3
Gossi Collections Liste zusammenfassen für JSP Allgemeine Java-Themen 4
Gossi Collections (Unbekannte) Liste Sortieren Allgemeine Java-Themen 10
T Collections Liste schnell/nebenläufig durchgehen Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
Q "Doppelte" Einträge einer Liste entfernen Allgemeine Java-Themen 14
C Exponentielle Verteilung in einer Liste Allgemeine Java-Themen 7
Nic.o liste der installierten Zertifikate ?! Allgemeine Java-Themen 3
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
M Verständnisfragen bezüglich Liste Allgemeine Java-Themen 3
S AWT Wie bekomme ich eine Liste aller chars in einem Font? Allgemeine Java-Themen 3
J Zeichenketten-Liste filtern Allgemeine Java-Themen 6
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
K Liste aller implementierenden Klassen einer Oberklasse anzeigen Allgemeine Java-Themen 4
M Eintrag verschwindet aus Liste Allgemeine Java-Themen 3
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
reibi Kopie einer Liste Allgemeine Java-Themen 4
N Liste mit Map abgleichen extrem langsam Allgemeine Java-Themen 6
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
T Liste sortieren Allgemeine Java-Themen 6
L Objekte in Liste packen Allgemeine Java-Themen 2
N Liste aendern waehrend des iterierens ueber selbige Allgemeine Java-Themen 11
B Datenstruktur: Liste Allgemeine Java-Themen 5
D Einfach verkettete Liste Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben