Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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..
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;
}
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.
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;
}
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.)
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> ...
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.
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..
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:
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.