Studium, Ausbildung und Beruf
 StudiumHome   FAQFAQ   RegelnRegeln   SuchenSuchen    RegistrierenRegistrieren   LoginLogin

java Generics (? extends K)
Gehe zu Seite 1, 2  Weiter
Neues Thema eröffnen   Neue Antwort erstellen
Foren-Übersicht -> Informatik-Forum -> java Generics (? extends K)
 
Autor Nachricht
SuiTheKid
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 04.07.2008
Beiträge: 71

BeitragVerfasst am: 23 März 2010 - 16:42:34    Titel: java Generics (? extends K)

Warum ist diese Methode nicht als void merge(Map<K,V> m) vereinbart?

/** a mapping from keys to values */
interface Map <K,V> {
void enter(K key, V val);
// adds or updates a map entry
void merge(Map <? extends K, ? extends V> m)
// adds or updates map entries, taking entries from map m
V lookup(K key) throws NotFound;
// delivers data value for given key
}
interface Clonable<T> { // NOT „Cloneable“ !
T copy(); // delivers DEEP COPY
}
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 23 März 2010 - 17:04:09    Titel:

Um den Anwendungsbereich der Methode zu erweitern. Jeder Eintrag einer Map, die merge übergeben bekommt, genügt den Vorgaben der "ursprünglichen" Map, also warum die Argumente unnötig einschränken?
SuiTheKid
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 04.07.2008
Beiträge: 71

BeitragVerfasst am: 23 März 2010 - 17:29:00    Titel:

Jeder Eintrag einer Map, die merge übergeben bekommt, genügt den Vorgaben der "ursprünglichen" Map!

Warum, irgendwie versteh ich das nicht.

kannst du vielleict ein simples Beispiel for Dummies machen.
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 23 März 2010 - 17:52:51    Titel:

Folgende Vorbemerkung: In Java werden sämtliche Typinformationen bei Generics zur Compilezeit eliminiert und auf simple Vererbung abgebildet, die aber nicht für die Elementtypen gilt: In eine List<Object> kannst du keine Strings stecken, obwohl String von Object erbt.

Ergo hättest du, wenn die Signatur der Methode

Code:
void merge(Map<K,V> m)


lauetet, nicht die Möglichkeit, z.B. eine Map<Integer, String> in eine Map<Integer, Object> zu mergen, da die beiden Maps unterschiedlichen Typs sind. Da aber String von Object erbt und deshalb die selben Eigenschaften besitzt, wurde die Signatur auf

Code:
void merge(Map <? extends K, ? extends V> m)


erweitert: von nun an kannst du Maps zusammen mergen, wenn ihre beinhaltenden Elemente (Schlüssel und Werte) in einer Vererbungshierarchie untereinander liegen.
SuiTheKid
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 04.07.2008
Beiträge: 71

BeitragVerfasst am: 23 März 2010 - 18:17:10    Titel:

das hab ich mir irgendwie gedacht, aber du kannst ja dann nur mergen
oder? andere funktionionen von map würden dann ja nicht klappen

danke für die antwort
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 24 März 2010 - 01:08:34    Titel:

Äh ja, klar -- alle anderen Methoden arbeiten aber ja auch nicht mit generischen Klassen als Übergabe, sondern mit gebundenen Typparametern (K, V).
SuiTheKid
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 04.07.2008
Beiträge: 71

BeitragVerfasst am: 25 März 2010 - 13:13:45    Titel:

deswegen sehe ich darin keinen sinn irgendwie.

hm naja
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 25 März 2010 - 14:30:38    Titel:

Den Sinn habe ich oben doch bereits erläutert: Natürlich könnte das mergen auf Maps mit den selben Typen beschränkt sein, aber wieso? Nach dem Liskov'schen Substitutionsprinzip ist jede Ableitung von K auch als K benutzbar, mit V respektive genauso. Deshalb wurde der Anwendungsbereich auch auf die jeweiligen Kindklassen erweitert.
SuiTheKid
Junior Member
Benutzer-Profile anzeigen
Junior Member


Anmeldungsdatum: 04.07.2008
Beiträge: 71

BeitragVerfasst am: 26 März 2010 - 10:05:55    Titel:

damit meine ich , dass ich nicht genau verstehe war man das nicht auch für z.B lookup macht.
Smutje
Senior Member
Benutzer-Profile anzeigen
Senior Member


Anmeldungsdatum: 18.07.2008
Beiträge: 3004
Wohnort: Gießen

BeitragVerfasst am: 26 März 2010 - 11:25:47    Titel:

Naja, wieso solltest du das tun? für lookup(K key); kannst du alle Typen einsetzen, die von K ableiten. Das ist eben ein fundamentaler Unterschied zu einem Parametertypen mit Generizität wie die Map eben, weil bei den generischen Parametern eine andere Art von Vererbung gilt, wie für "normale" Typparameter.
Beiträge der letzten Zeit anzeigen:   
Foren-Übersicht -> Informatik-Forum -> java Generics (? extends K)
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Chat :: Nachrichten:: Lexikon :: Bücher :: Impressum