Ich möchte ein neues Element erstellen, das ähnlich wie Util.Map.Entry
, die die Struktur Schlüssel
, Wert
enthalten wird.
Das Problem ist, dass ich keine Map.Entry
instanziieren kann, weil es eine Schnittstelle ist.
Weiß jemand, wie man ein neues generisches Schlüssel/Wert-Objekt für Map.Entry erstellt?
Da's public static class AbstractMap.SimpleEntry<K,V>
. Lassen Sie sich nicht vom Abstract
-Teil des Namens in die Irre führen: es ist tatsächlich NICHT eine abstrakte
Klasse (aber ihre oberste Ebene AbstractMap
ist es).
Die Tatsache, dass es sich um eine "statische" verschachtelte Klasse handelt, bedeutet, dass Sie NICHT eine umschließende "AbstractMap"-Instanz benötigen, um sie zu instanziieren, so dass so etwas wie das hier gut kompiliert werden kann:
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
Wie in einer anderen Antwort erwähnt, hat Guava auch eine praktische static
Fabrikmethode Maps.immutableEntry
, die Sie verwenden können.
Sie sagten:
Ich kann Map.Entry
selbst nicht verwenden, weil es offenbar ein schreibgeschütztes Objekt ist, das ich nicht neu instanziieren kann.
Das ist nicht ganz richtig. Der Grund, warum Sie es nicht direkt instanziieren können (d.h. mit new
) ist, dass es ein Interface Map.Entry
ist.
Wie in der Dokumentation vermerkt, ist AbstractMap.SimpleEntry
@since 1.6
, wenn Sie also an 5.0 festhalten, dann ist es für Sie nicht verfügbar.
Um nach einer anderen bekannten Klasse zu suchen, die Map.Entry implementiert, können Sie direkt in der Javadoc nachsehen. Aus der Java 6 Version
Interface Map.Entry<K,V>
Alle bekannten implementierenden Klassen:
Leider listet die 1.5 Version keine bekannte implementierende Klasse auf, die Sie verwenden können, so dass Sie möglicherweise auf die Implementierung einer eigenen Klasse angewiesen sind.
Sie können einfach die Schnittstelle Map.Entry<K, V>
selbst implementieren:
import java.util.Map;
final class MyEntry<K, V> implements Map.Entry<K, V> {
private final K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
}
}
Und dann verwenden Sie es:
Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
Probieren Sie Maps.immutableEntry aus Guava
Dies hat den Vorteil, dass es mit Java 5 kompatibel ist (im Gegensatz zu AbstractMap.SimpleEntry
, das Java 6 benötigt).