Generische Typen: Frage dazu

Status
Nicht offen für weitere Antworten.

Souljumper

Aktives Mitglied
Code:
	public static void main(String [] s)
	{
		List<Number> numberList = new ArrayList<Number>();
		
		List<? extends Number> obenBesch  = numberList;
		List<? super   Number> untenBesch = numberList;
		
		obenBesch.add(new Integer(3)); //Geht nicht, wieso?
		untenBesch.add(new Integer(3)); //Geht, wieso ?
	}

<? extends Number> sagt doch aus, das mein Typ ein Datentyp sein muss der von Number erbt? (also extended). Wieso kann ich dann kein Integer einfügen? da dies doch ein ein Datentyp ist, der von Number geerbt hat?

wenn ich <? super Number> benutze sage ich, dass mein Datentyp Number als seine direkte Oberklasse haben muss.

Wieso ist jetzt die super-Variante ausreichend um ein integer hinzuzufügen und die extends-Variante nicht?
 

0x7F800000

Top Contributor
[highlight=Java]
public static void main(String [] s)
{
List<Number> numberList = new ArrayList<Number>();

List<? extends Number> obenBesch = numberList; //es wird garantiert, dass alles, was ich aus dieser liste raushole, von Number erbt
List<? super Number> untenBesch = numberList; //es wird garantiert, dass in diese Liste jede Number (und jede Unterklasse) reinpasst

Number x=obenBesch.get(0); // <---- dafür ist es gedacht!!!
untenBesch.add(new Integer(3)); //Geht, wieso ? weil Integer<Number<Jede Oberklasse von Number
}
[/highlight]

Das erste kann nicht gehen, denn:
[highlight=Java]
List<? extends Number> obenBesch=new LinkedList<Double>();
//muss gehen, weil Double<Number.
//Alles, was ich aus dieser Liste rausbekomme _ist_ Number.
//Heißt aber noch lange nicht, dass ich da jede Number reinstopfen kann
//insbeondere kann man da keine Integer reinstopfen:
obenBesch.add(new Integer(3)); //geht nicht
//Doubles darf man da übrigens auch nicht reinstopfen, nur mal nebenbei bemerkt:
obenBesch.add(new Double(3.2)); //geht auch nicht
[/highlight]
 
Zuletzt bearbeitet:
S

SlaterB

Gast
der Variablen obenBesch (euerter Name)
kannst du eine ArrayList<Double> zuweisen, denn Double passt auch zu Number,

da die Liste weiterhin genauso als ArrayList<Double> existiert, würde dort dann nach Einfügen eines Integers beim get() eine ClassPathException auftreten,
also ist es verboten, in einer Liste unbekannten Typs irgendwas einzufügen (außer dem Wert null)

List<Double> x = ArrayList<Double>();
List<? extends Number> obenBesch = x;
obenBesch.add(Integer.valueOf(2));

Double d = x.get(0); // Achtung, Programmabsturz

-------

bei List<? super Number> weiß man, dass der generische Parameter der enthaltenen Liste entweder
Number oder einer dessen Superklassen ist, man kann also garantiert Number einfügen und die
generisch korrekten get-Aufrufe werden funktionieren

aber am besten nachlesen, z.B. :
Generics in Java 1.5
 

Souljumper

Aktives Mitglied
also
List<? extends Typ_X> li
sagt aus, dass der Wert den ich entnehmen aufjedenfall zu Typ_X kompatible ist, deswegen ist
Typ_X x = li.get(0);
erlaubt.
Dadurch das ich nicht spezifiere was reingetan werden darf, ist nur "null" möglich

während
List<? super Typ_X) li
das gegenteil macht und beschreibt was ich reinschreiben darf? weswegen ich alles reinschreiben darf was Typ_X als Oberwert hat, aber nicht Typ_X selbst.
li.add(new SubTyp_X(wert)); //geht
li.add(new Typ_X(wert)); // geht nicht
Dadurch das ich nicht spezifiere welche eigenschaft die Werte haben die ich raushole, darf ich nur Objects entfernen, weil jeder java-typ als obertyp garantiert Object hat.

is das so richtig? sollte das selbe in grün sein was in Slaters generic-link steht.
 

Souljumper

Aktives Mitglied
hab das mit dem integer und number beispiel probiert

new Number(3) funzt natürlich nicht. mein fehler

mit (Number)(new Integer(3)) gehts.
 

Souljumper

Aktives Mitglied
verstehe ich nicht. Wofür steht das "s" beim "gehts"? Was geht????:L

sry, bissle zerhackt.

"damit gehts" war die Aussage. Hab meinen fehler erkannt. Hatte das abstrakte versucht anhand von Number und Integer zu konkretisieren und hab dabei den fehler gemacht ein number objekt mit "new number(3)" zu erzeugen. was nicht geht. ich dachte zeurst das geht nicht weil die generics da nicht passen. aber der aufruf war falsch.

damit gehts es dann schon eher: (number) (new integer(3)).
 
G

Gast2

Gast
[HIGHLIGHT="Java"]

public class TestGenerics {

public static void main(String[] args) {

List<Double> doubleList = new ArrayList<Double>();

// das Wildcard sagt aus du kannst alles als Liste übergeben was von Number erb
List<? extends Number> numberList = doubleList;

// hier würdest du AUCH !!!! der doubleList ein Integer hinzufügen
numberList.add(new Integer(3)); // geht nicht ,weil siehe *

for (Double doubleValue : doubleList) {
System.out.println(doubleValue);// *würde es hier eine cast exception geben
// weil Integer != Double
}

}
}
[/HIGHLIGHT]
 
S

SlaterB

Gast
während
List<? super Typ_X) li
das gegenteil macht und beschreibt was ich reinschreiben darf? weswegen ich alles reinschreiben darf was Typ_X als Oberwert hat, aber nicht Typ_X selbst.
li.add(new SubTyp_X(wert)); //geht
li.add(new Typ_X(wert)); // geht nicht
Dadurch das ich nicht spezifiere welche eigenschaft die Werte haben die ich raushole, darf ich nur Objects entfernen, weil jeder java-typ als obertyp garantiert Object hat.

is das so richtig? sollte das selbe in grün sein was in Slaters generic-link steht.
li.add(new Typ_X(wert)); geht genauso, warum nicht?

die Liste ist füt Typ_X oder eine seiner Oberklassen spezifiziert,
also sind alle Typ_X und deren Unterelemente ok,

wenn's ne List<Object> war, wird get() Object zurückliefern,
wenn's ne List<Super_Typ_X> war, wird get() Super_Typ_X zurückliefern,
wenn's ne List<Typ_X> war, wird get() Typ_X zurückliefern,
nichts davon kann durch Einfügen von Typ_X oder dessen Unterklassen kaputt gemacht werden

----

Entfernen kann man aus allen Listen zu jeder Zeit, da gibts nie Probleme
 

Souljumper

Aktives Mitglied
Ok, danke soweit

Code:
		List<Double> numberList = new ArrayList<Double>();
		
		List<? super   Number> untenBesch = numberList;

wieso funktioniert das hier nicht?
Weil numberList bereits Double ist, und eine Zuweisung an eine Liste mit einer Begrenzung das der Typ von Number erben oder Number sein muss, in diesem Fall die Bedingung lockern würde?
sehe ich das richtig?
 

Marco13

Top Contributor
Ich find's hilfreich, sich zu überlegen, was derjenige, der die Referenz bekommt, dann mit ihr anfangen könnte - und man kann fast sicher sein: Wenn eine Zuweisung nicht geht, dann könnte man irgendwas nicht-typsicheres machen. Detailliertere Erklärungen könnten schnell vom 100. ins 1000. kommen, und die überlasse ich mal den anderen - aber den Link auf AngelikaLanger.com - Java Generics FAQs - Under The Hood Of The Compiler - Angelika Langer Training/Consulting wollte ich noch posten....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
B Generische Typen instanzieren Allgemeine Java-Themen 11
Zrebna Random Number - Generische Formel zwischen zwei INKLUSIVEN Werten Allgemeine Java-Themen 16
F Verständnisprobleme Aufgabenstellung Aktionsobjekte und generische Listen Allgemeine Java-Themen 1
J Generische Interface - Problem Allgemeine Java-Themen 3
J Generische Interfaces mehrfach einbinden Allgemeine Java-Themen 11
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
A Methoden Generische Methode mit Arrays - Source Compatibility 1.7 benötigt, wieso? Allgemeine Java-Themen 3
H Interface Generische Schnittstelle (rekusiv) Allgemeine Java-Themen 2
C generische Authentifizierung Allgemeine Java-Themen 7
JCODA Generische Map Frage Allgemeine Java-Themen 10
H Generische Array Allgemeine Java-Themen 11
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
D Methode für generische enummap/enum Allgemeine Java-Themen 10
B Generische Datentypen MergeSort Allgemeine Java-Themen 5
M Generische Klassen Allgemeine Java-Themen 3
M generische Listener Allgemeine Java-Themen 2
H generische Klasse Realtion Allgemeine Java-Themen 2
T Ideenfindung: Generische Transportklasse? Allgemeine Java-Themen 3
C Generische Methode (Schablone) Allgemeine Java-Themen 8
G generische Klasse als Parameter einer generischen Klasse Allgemeine Java-Themen 5
leifg Rechenoperationen auf generische Datentypen Allgemeine Java-Themen 10
R Generische Listener und Sender Allgemeine Java-Themen 12
M Generische Datentypen Allgemeine Java-Themen 14
S Generische Liste Allgemeine Java-Themen 30
F Viele generische Parameter sinnvoll? oder besser casten? Allgemeine Java-Themen 10
S Generische Methode Allgemeine Java-Themen 13
R Frage zu einfügen in generische lineare Liste Allgemeine Java-Themen 7
S Generische Methoden Allgemeine Java-Themen 7
D Statische, generische Methode will nicht. Allgemeine Java-Themen 2
T JavaPoet - (noch) nicht existente Typen Allgemeine Java-Themen 2
T Fremde Typen mockt man nicht? Allgemeine Java-Themen 3
M Generics / Typen Allgemeine Java-Themen 1
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
RalleYTN Datentypen Herausfinden ob Object ein Array ist ohne den Typen des Arrays zu kennen? Allgemeine Java-Themen 12
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
F Grundrechenarten mit eigenen Typen Allgemeine Java-Themen 9
N Vergleich von generischen Typen Allgemeine Java-Themen 2
S Überschriebene Methode eines generischen Typen aufrufen Allgemeine Java-Themen 4
K Arrays.asList und primitive Typen Allgemeine Java-Themen 2
H2SO3- problem mit objecten verschiener Typen (E, <E> und T) Allgemeine Java-Themen 2
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
T DataFrame (Matrix mit mit verschiedenen Typen pro Spalte) Allgemeine Java-Themen 4
H2SO3- merken versch. Date Typen + erlaubte und unerlaubte kombinat Allgemeine Java-Themen 4
V Variable vom Typ String zum Typen "Message" konve Allgemeine Java-Themen 2
F Kann man keine Arrays von generischen Typen erstellen? Allgemeine Java-Themen 2
Q Typen von Generics & Casten Allgemeine Java-Themen 3
D Listen von Generischen Typen inkl. Vererbung Allgemeine Java-Themen 2
lumo Typen MSSQL + JAVA Allgemeine Java-Themen 4
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Methoden auf Arrays aller primitiver Typen zusammenfassen? Allgemeine Java-Themen 8
C Dynamisch Objekte unterschiedlicher Typen erzeugen Allgemeine Java-Themen 6
S Variablennamen von primitiven Typen eines Konstruktors lesen Allgemeine Java-Themen 7
J parsen von verschiedenen dokument typen Allgemeine Java-Themen 3
S generics primitiver typen Allgemeine Java-Themen 5
D generischer Iterator mit verschiedenen Typen Allgemeine Java-Themen 3
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
8u3631984 Frage Performance bei Linked List und Array List Allgemeine Java-Themen 5
H Frage regex greater than less than Allgemeine Java-Themen 7
berserkerdq2 Frage zu IntelliJ und JavaFX Allgemeine Java-Themen 1
W Timer Konzept-Frage Allgemeine Java-Themen 16
T Eine Frage des Designs Allgemeine Java-Themen 2
C Frage zu eigenem TableCellRenderer Allgemeine Java-Themen 11
C Programmvorstellung & Frage zum Thema Geschäftsform Allgemeine Java-Themen 51
J Frage zu System.getproperties. Allgemeine Java-Themen 60
molat100 wie kann man die Frage beantworten Allgemeine Java-Themen 1
pkm Frage zur Präzision von Calendar.WEEK_OF_YEAR Allgemeine Java-Themen 12
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
pkm Frage nach eventuellem syntaktischen Zucker bei der Konkatenation von ArrayLists Allgemeine Java-Themen 4
M Frage-Antwortspiel wie Wer wird Millionär Allgemeine Java-Themen 1
F Frage zu System.in Allgemeine Java-Themen 3
marcooooo Frage zum Beispiel im Anhang Allgemeine Java-Themen 16
T Meine Frage lautet wie ich 2 CSV Dateien miteinander in Java verbinde und Spalten die zueinander gehören durch den gleichen Key zusammen ausgebe? Allgemeine Java-Themen 5
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
B For-Loop Frage Allgemeine Java-Themen 21
L Java frage Allgemeine Java-Themen 3
bueseb84 Frage zu Mock und UpperBound Allgemeine Java-Themen 2
M Frage zum Konstruktor Allgemeine Java-Themen 2
W Best Practice Frage zur Umsetzung MVC Allgemeine Java-Themen 9
P String-Verschlüsselung - Frage zur Sicherheit Allgemeine Java-Themen 21
B Frage zu Unit-Tests Allgemeine Java-Themen 6
T Allgemeine Frage: GUI für 3D-Visualisierung Allgemeine Java-Themen 5
R Allgemeine Frage zu RMI bei MVC Allgemeine Java-Themen 2
O Frage zum Runtimeverhalten von Java ... Allgemeine Java-Themen 2
H Rundreise frage (Algorithmus) Allgemeine Java-Themen 18
B Generelle Frage bei einer Webanwendung / Reduzierung von DB Abfragen Allgemeine Java-Themen 1
D Frage zu Vererbung Allgemeine Java-Themen 5
J Frage zu regulärem Ausdruck Allgemeine Java-Themen 2
M Allgemeine Frage: Wie lernt man Java / Programmieren von Grund auf? Allgemeine Java-Themen 7
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
S Frage zur JLS Allgemeine Java-Themen 0
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
A Methoden Allgemeine Java Frage Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben