Datentypen Generic mit parameterlosem Konstructor

Neumi5694

Top Contributor
Hallo, ich würde gerne etwas in der folgenden Art machen

Java:
public static T getOrAdd(HashMap<K,T> map, K key) {
    if (map == null || key == null) {
        return null;
    }
    T result = map.get(K);
    if (result == null) {
        result = new T(); //klappt so natürlich nicht, T.getClass().newInstance() geht auch nicht.
        map.put(key, result);
    }
    return result;
}

Klar, dass sich der Compiler da querstellt.
Habe ich eine Möglichkeit, das irgendwie hinzukriegen? Es geht nur um Klassen mit parameterlosen Konstruktor, alles andere darf gerne eine Exception werfen.

Ich würde mir gerne ersparen, einen Default-Wert an die Methode übergeben zu müssen (also auch dann eine Instanz zu erstellen, wenn gar kein Wert gebraucht wird).
 

Flown

Administrator
Mitarbeiter
Nein du hast keine Möglichkeit den Typ T während runtime zu erfragen. Darum funktioniert das auch nicht. Wenn du Java 8 besitzt, dann kannst du ganz einfach Supplier und Methodenreferenzen benutzen mit:
Java:
public static <T, K> T getOrAdd(Map<K, T> map, K key, Supplier<T> tGenerator) {
  if (map == null || key == null) {
    return null;
  }
  T result = map.get(key);
  if (result == null) {
    result = tGenerator.get();
    map.put(key, result);
  }
  return result;
}
Und mit getOrAdd(map, key, TImpl::new); aufrufen.

Wenn schon Java 8, dann gibts für die Map auch schon eine vorgefertigte Methode die Map::compute heißt. Dann funktioniert das so:
Java:
map.compute(key, (k, v) -> v == null ? tGenerator.get() : v);
 

Baldur

Aktives Mitglied
Ggf kannst du auch sowas in der Art probieren:

Java:
public static T getOrAdd(HashMap<K,T> map, K key, Class<T> c) {
    if (map == null || key == null) {
        return null;
    }
    T result = map.get(K);
    if (result == null) {
        result = c.newInstance();
        map.put(key, result);
    }
    return result;
}

...

getOrAdd(map, "key", Integer.class);

Würde da aber eher die Lösung mit dem Supplier<T> vorziehen (Methodenreferenz auf new geht tatsächlich? Wusste ich bisher noch gar nicht :))

Wenn du deine Hilfsfunktion nicht statisch hast, kannst du ja das Class-Objekt (oder den Supplier) auch irgendwo als Member halten, so daß du ihn nicht jedesmal als Parameter übergeben musst.
 

Neumi5694

Top Contributor
Danke, ich hab's letztendlich auch so ähnlich gemacht, mir auch ein paar statische Member als Standard-Supplier bereitgestellt.
Lambdas kann ich nicht leiden, ich bin noch am Experimentieren, ob ich eine generische BiFunction-Klasse anhand eines Suppliers zusammenstellen kann. Hohe Prio hat das aber keine, nur etwas Tüftelei.
Die aktuelle Lösung funktioniert gut genug.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
C Generic collections und static typing Allgemeine Java-Themen 4
K Generic class und Reflection Allgemeine Java-Themen 2
K Saubere Verwendung von Generic Types Allgemeine Java-Themen 7
T Generic Allgemeine Java-Themen 1
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
M Cannot create a generic array of T Allgemeine Java-Themen 5
N Generic extends Generic Allgemeine Java-Themen 5
TheWhiteShadow Generic Bug? Allgemeine Java-Themen 19
P Generic zur Laufzeit Allgemeine Java-Themen 4
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
S Reflection und Generic Allgemeine Java-Themen 9
G Klasse eines Generic Allgemeine Java-Themen 6
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
G Generic merhfach Angabe Allgemeine Java-Themen 8
Dragonfire Generic Typ zur Laufzeit Allgemeine Java-Themen 9
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
N generic reflection Allgemeine Java-Themen 5
thE_29 Generic Methoden die sich aufrufen wollen nicht immer Allgemeine Java-Themen 12
A Generic-Problem. was meint ihr dazu? Allgemeine Java-Themen 4
G unbekanntes Generic Allgemeine Java-Themen 12
K Bound mismatch: The generic method sort(List<T>) of ty Allgemeine Java-Themen 4
V ArrayList ist nicht generic!?? Oder bin ich blöd? Allgemeine Java-Themen 2
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
C Generic Type ermitteln Allgemeine Java-Themen 3
H References to generic type Test.A<typ> should be param Allgemeine Java-Themen 5
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
Drachenbauer Wie muss ein Konstructor aussehen, um dinge mit verschiedenen Zusätzen in den "<>" anzunehmen? Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben