Funktion verallgemeinern

Status
Nicht offen für weitere Antworten.

Bit2_Gosu

Bekanntes Mitglied
Hi!

Ich habe mir folgende recht allgemeine Funktion geschrieben:

Code:
public Map.Entry <String, String> getRandomMapEntry(
			Map <String, String> map)
	{
		Random random = new Random();
		Set <Map.Entry <String, String>> entrySet = map.entrySet();
		Iterator <Map.Entry <String, String>> it = entrySet.iterator();
		Map.Entry <String, String> mapEntry;
		int size = entrySet.size();
		int zahl = random.nextInt(size);
		for (int i = 0; i < size; i++)
		{
			mapEntry = it.next();
			if (i == zahl)
			{
				return mapEntry;
			}
		}
		return null;
	}

Nun würde ich gerne, dass die Funktion nicht nur Maps vom Typ <String, String> annimmt, sondern auch anders parametrisierte Maps.

Würdet ihr da die Parametrisierung < , > weglassen? Dann meckert aber der Compiler und ich frage mich, ob das so sauber wäre..
 

tfa

Top Contributor
Man kann auch Methoden parametrisieren:
Code:
public <K, V> Map.Entry<K, V> getRandomMapEntry(Map<K, V> map) {
    Random random = new Random();
    Set<Map.Entry<K, V>> entrySet = map.entrySet();
    Iterator<Map.Entry<K, V>> it = entrySet.iterator();
    Map.Entry<K, V> mapEntry;
    int size = entrySet.size();
    int zahl = random.nextInt(size);
    for (int i = 0; i < size; i++) {
        mapEntry = it.next();
        if (i == zahl) {
            return mapEntry;
        }
    }
    return null;
}
 

Atze

Top Contributor
entweder du lässt halt die generics weg, oder gibst den typ object an, wenn du damit die warnungen "abschalten" willst

trotzdem fällt dann aber noch weiter arbeit an, da du dann innerhalb der methode auf den objektyp überprüfen und casten musst.

kann ja auch sein dass es kein string oder kein int ist, was sich in der map befindet
 

byte

Top Contributor
Du musst in der Methode nicht casten. In der Zeit vor Generics hat man sowas halt mit Object gelöst. Casten muss man nur überall dort, wo man die Methode dann verwendet.
 

Atze

Top Contributor
stimmt, falsch überflogen, "zahl" kommt ja garnicht aus der map :) sorry

ja, aber casten bleibt ihm wohl trotzdem nicht erspart :)
 

Bit2_Gosu

Bekanntes Mitglied
Also das:

Code:
public <K, V> Map.Entry<K, V> getRandomMapEntry(Map<K, V> map) { 
    Random random = new Random(); 
    Set<Map.Entry<K, V>> entrySet = map.entrySet(); 
    Iterator<Map.Entry<K, V>> it = entrySet.iterator(); 
    Map.Entry<K, V> mapEntry; 
    int size = entrySet.size(); 
    int zahl = random.nextInt(size); 
    for (int i = 0; i < size; i++) { 
        mapEntry = it.next(); 
        if (i == zahl) { 
            return mapEntry; 
        } 
    } 
    return null; 
}

hört sich irgendwie am besten an ;)

Ich verstehe nur
<K, V> Map.Entry<K, V>
nicht..
Also die Methode returned ein Objekt vom Typ Map.Entry<K, V>. Aber wozu ist dann das <K, V> vor dem return Typ da?
 

tfa

Top Contributor
Code:
Map<JLabel,Thread> map = new HashMap<JLabel,Thread>();
...
Map.Entry<JLabel,Thread> zufallselement = getRandomMapEntry(map);

JLabel label = zufallselement.getKey();
Thread thread = zufallselement.getValue();
Wo wird da gecastet?
Es ist doch gerade der Sinn von Generics, dass man nicht casten muss.


Ich verstehe nur
<K, V> Map.Entry<K, V>
nicht..
Also die Methode returned ein Objekt vom Typ Map.Entry<K, V>. Aber wozu ist dann das <K, V> vor dem return Typ da?
K und V sind die Parameter der Methode. Das ist ganz analog zu den Parametern einer Klasse.
Beim Aufruf muss man sie nicht mal angeben, da es der Compiler normalerweise schafft, die richtigen Typen
herauszufinden. Man kann sie aber trotzdem explizit angeben, z.B.:
Code:
this.<JLabel, Thread> getRandomMapEntry(map);
wobei der Aufruf in diesem Beispiel in der gleichen Klasse stattfindet, in der auch die Methode definiert ist (daher das this.)
 

Bit2_Gosu

Bekanntes Mitglied
Also diese Antwort verstehe ich leider nicht..

Wo wäre denn der logische Fehler, wenn ich das erste <K, V> weglasse?
 

tfa

Top Contributor
Dann ist die Methode nicht parametrisiert. Das würde nicht kompiliert werden.
Parametrisieren = Verallgemeinen, und das wolltest du doch.

EDIT: In diesem Beispiel sieht es zugegeben etwas sinnlos aus, aber man kann
auch folgendes machen:
Code:
<K extends Comparable, V extends Number>
Damit würde man die Parameter mit Einschränkungen (Bounds) versehen.
 

Bit2_Gosu

Bekanntes Mitglied
Ah, jetzt hab ich es glaube ich verstanden!

Nicht nur der return Typ, sondern auch die Methode wird parametrisiert (wie du es ja auch schon gesagt hast)!

Vielen Dank an alle ;)
 

Bit2_Gosu

Bekanntes Mitglied
Sorry, aber ich habe doch noch mal eine Frage, zu <K, V>

Bei:

Code:
public Map.Entry <String, String> getRandomMapEntry( 
         Map <String, String> map) 
   { 
      Random random = new Random(); 
      Set <Map.Entry <String, String>> entrySet = map.entrySet(); 
      Iterator <Map.Entry <String, String>> it = entrySet.iterator(); 
      Map.Entry <String, String> mapEntry; 
      int size = entrySet.size(); 
      int zahl = random.nextInt(size); 
      for (int i = 0; i < size; i++) 
      { 
         mapEntry = it.next(); 
         if (i == zahl) 
         { 
            return mapEntry; 
         } 
      } 
      return null; 
   }

muss ich ja auch nicht schreiben
public <String, String> Map.Entry <String, String> ...

Warum muss ich das aber bei <K, V> ??
 

tfa

Top Contributor
Code:
public Map.Entry <String, String> getRandomMapEntry(Map <String, String> map){..}
ist nicht parametrisiert.
Diese Funktion akzeptiert nur Map<String, String> und nichts anderes, d.h. die Typen sind fest vorgegeben und nicht frei. Deswegen hat man die Parameter <K,V> auch nicht.
 

masta // thomas

Bekanntes Mitglied
Stellt dir K und V als Platzhalter vor.
Und am besten schaust du dir kurz Generics an, in einem Buch oder E-Book :) Ist garnicht so schwer.
 

tfa

Top Contributor
masta // thomas hat gesagt.:
Und am besten schaust du dir kurz Generics an, in einem Buch oder E-Book :) Ist garnicht so schwer.
Find ich schon. Meiner Meinung sind Generics das kompliziertes Sprachfeature von Java.
 

Bit2_Gosu

Bekanntes Mitglied
Hm kennt einer von euch vielleicht eine Seite, auf der auf Deutsch oder auf nicht ganz so schwerem Englisch erklärt ist, was es eigentlich bedeutet, wenn eine Funktion parametrisiert ist?

Ich habe mir die ersten 3 Seiten von eurem Link durchgelesen und finde das wirklich sehr schwer, neben der Sprache besonders die Beispiele..
 

byte

Top Contributor
Die Closure-Entwürfe sind imo nur so komplex, gerade weil sie massiv auf Generics aufbauen. ;) Wenn man also differenziert, würden Generics auf Platz 1 bleiben. :bae:
 

Bit2_Gosu

Bekanntes Mitglied
Also den Artikel fand ich besonders gut:

In meiner Methode sagt das erste <K, V> also überhaupt, was "K" und "V" überhaupt sein können. Ich könnte auch <K extends Comparable<K>, V> sagen, und hätte dann das <K, V> vom Argumenttyp der Funktion und auch das <K, V> des return Typs eingeschränkt. In meiner Funktion habe ich aber keine Bounds gesetzt und deshalb kann zB. "K" alles sein.

Habe ich das jetzt richtig verstanden?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Umgang mit Graphics unklar : Erstellung u Uebergabe an Funktion Java Basics - Anfänger-Themen 18
E Hilfe bei rekursiver Funktion Java Basics - Anfänger-Themen 3
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
M Eine Funktion zuweisen Java Basics - Anfänger-Themen 3
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
G Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
I Generische Funktion Java Basics - Anfänger-Themen 3
E Pervasive PSQL insert funktion geht nicht Java Basics - Anfänger-Themen 9
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
T Log Funktion erstellen Java Basics - Anfänger-Themen 1
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
H Den Wert einer rekursiven Funktion bestimmen Java Basics - Anfänger-Themen 5
J In main() Datei geöffnet, von anderer Funktion beschreiben Java Basics - Anfänger-Themen 3
M toDouble Funktion Java Basics - Anfänger-Themen 3
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
X Ackermannsche Funktion Java Basics - Anfänger-Themen 32
F Arrays: Mathematische Funktion Java Basics - Anfänger-Themen 19
P Dezimal zu Hexadezimalzahl Funktion Java Basics - Anfänger-Themen 5
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
M Arrays in Funktion Kopieren und Bearbeiten Java Basics - Anfänger-Themen 4
B Funktion mit mehreren Rückgabewerten aka Prozeduren? Java Basics - Anfänger-Themen 12
J Dynamisches Array durch split()-Funktion? Java Basics - Anfänger-Themen 3
D Funktion nur 1 Rueckgabewert Java Basics - Anfänger-Themen 9
M Wie lang eine Funktion/Methode? Java Basics - Anfänger-Themen 51
N den inhalt eines array per funktion ausgeben Java Basics - Anfänger-Themen 8
R Ackermann Funktion Java Basics - Anfänger-Themen 2
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
E Contain-funktion überlisten Java Basics - Anfänger-Themen 4
J Division ohne Arithmetische Funktion Java Basics - Anfänger-Themen 2
S Funktion in Klasse auslagern Java Basics - Anfänger-Themen 4
J Problem mit Boolean bei Funktion! Java Basics - Anfänger-Themen 5
S Gibt es eine Funktion, die gewissermaßen eine Reihe von instanceOf() vereinheitlicht? Java Basics - Anfänger-Themen 19
D Nullstellen einer Funktion 3. Grades mit Horner Schema Java Basics - Anfänger-Themen 6
Aprendiendo Gibt es in der JAVA-API eine Funktion, die eine Dezimalzahl in eine binäre Zahl umwandelt? Java Basics - Anfänger-Themen 8
D Funktion gibt Dimension zurück Java Basics - Anfänger-Themen 11
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
B Zugriffe in einer Klasse / Funktion Java Basics - Anfänger-Themen 9
T Koordinatensystem zeichnen - Variablen merken? Quadratische Funktion zeichnen? Java Basics - Anfänger-Themen 5
J Array innerhalb einer Funktion mehrfach iniatilisieren Java Basics - Anfänger-Themen 4
T Lambda-Funktion bei Binärbäumen Java Basics - Anfänger-Themen 13
J Wie lässt sich der Konstruktor einer Klasse einer Funktion einer Klasse nutzen. Java Basics - Anfänger-Themen 4
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
B OOP Wie benutze ich die Main Funktion richtig? Java Basics - Anfänger-Themen 10
H Nicht Static Funktion ohne Objekt aufrufen? Java Basics - Anfänger-Themen 6
K Methoden mit den Namen accept. Welche Funktion haben diese? Java Basics - Anfänger-Themen 2
E Compare-Funktion bei eigener Klasse Java Basics - Anfänger-Themen 4
S Threads run - Funktion wird nur einmal ausgeführt. Java Basics - Anfänger-Themen 8
B Anwender soll mathematische Funktion eingeben können, Einfachster Fnktionsplotter Java Basics - Anfänger-Themen 4
R If Funktion funktioniert nicht :P Java Basics - Anfänger-Themen 3
H Funktion in Hintergrund und Vordergrund ausführen Java Basics - Anfänger-Themen 11
S Funktion die mir fuer einen String eine Zahl zwischen 0.0 und 1.0 zurueckliefert..? Java Basics - Anfänger-Themen 9
S Funktion eines Stacks Java Basics - Anfänger-Themen 4
T Integer-Objekt über Hash-Funktion in Array ablegen Java Basics - Anfänger-Themen 1
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
D Keine Funktion bei "else" Java Basics - Anfänger-Themen 5
S timer funktion mit javax panel Java Basics - Anfänger-Themen 3
T Klassen Funktion in einem Funktionsaufruf definieren Java Basics - Anfänger-Themen 3
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
X Eval-Funktion mit Variable Java Basics - Anfänger-Themen 2
T Screenreader Funktion Java Basics - Anfänger-Themen 2
S Wertetabelle einer Funktion f : R -> R Java Basics - Anfänger-Themen 1
P Methoden suche funktion die char wert ausgibt wenn man numerischen wert und radix angibt Java Basics - Anfänger-Themen 1
1 repaint() Funktion erzeugt Flackern Java Basics - Anfänger-Themen 33
J Taschenrechner Funktion Java Basics - Anfänger-Themen 18
R if funktion ohne else - Bedingung trifft nicht zu, ausgabe nicht nachvollziehbar Java Basics - Anfänger-Themen 7
shiroX OOP Java Funktion implementieren Java Basics - Anfänger-Themen 3
O Debug-Funktion mit Slick - Kleines Problem Java Basics - Anfänger-Themen 5
F Funktion immer zur vollen Stunde? Java Basics - Anfänger-Themen 3
S ResultSet close() in funktion nich möglich. Java Basics - Anfänger-Themen 8
C Meine erste Funktion Java Basics - Anfänger-Themen 12
J Funktion um JSON per Post senden/emfangen Java Basics - Anfänger-Themen 3
G OOP Aus Objekt auf Funktion der erzeuger Klasse zugreifen? Java Basics - Anfänger-Themen 11
D Binäre Suche für Integerarray in rekursiver Funktion Java Basics - Anfänger-Themen 5
M Interface als Konstruktorparameter nutzen, um Funktion zu plotten Java Basics - Anfänger-Themen 14
NR_EIGHT Benutzereingabe in Funktion verpacken Java Basics - Anfänger-Themen 4
J Funktion definieren und ausfuehren Java Basics - Anfänger-Themen 27
D Loop Funktion für Robot Klasse Java Basics - Anfänger-Themen 5
N mathematische Funktion Java Basics - Anfänger-Themen 29
R Programm verstehen, Funktion Java Basics - Anfänger-Themen 4
C Automatisches Ausfuehren einer Funktion beim Laden eines Jar files Java Basics - Anfänger-Themen 3
O Nicht Standard Form boolesche Funktion in Standard Form parsen Java Basics - Anfänger-Themen 3
F Sleep Funktion Java Basics - Anfänger-Themen 12
S Euklid Funktion Java Basics - Anfänger-Themen 8
H Funktion mit Argumenten Java Basics - Anfänger-Themen 5
Q Random Funktion JButtons Java Basics - Anfänger-Themen 6
O Probleme mit der repaint-Funktion Java Basics - Anfänger-Themen 6
F Eine Frage über paint() Funktion Java Basics - Anfänger-Themen 2
S Parameterübergabe - identische Funktionen, aber falsche Funktion Java Basics - Anfänger-Themen 5
C Probleme mit replaceAll Funktion Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben