Ich habe eine Frage zu Java-Generika. Sagen, ich habe die folgende Schnittstelle:Java - Generika & Wildcards & Schnittstelle versus Implementierung
public static class Something<T> {
public void set(T t) {
}
}
public static interface Manager<T> {
public void add(final String key, final Something<T> o);
public Something<T> get(final String key);
}
Ein Beispiel für die Nutzung:
final Manager<Number> m = ...;
m.add("key", new Something<Number>());
m.get("key").set(new Integer(5));
Ich würde auch Something<Integer>
, in der Lage sein möge hinzufügen Something<Double>
, ... zum einem Manager<Number>
. Ich würde sagen, ich habe die Unterschrift der Add-Funktion zu ändern:
public static interface Manager<T> {
public void add(final String key, final Something<? extends T> o);
public Something<T> get(final String key);
}
final Manager<Number> m = ...;
m.add("key", new Something<Integer>());
m.get("key").set(new Integer(5));
So weit, so gut. Lassen Sie sich bei einer möglichen Implementierung des Managers aussehen:
public static class ManagerImplementation<T> implements Manager<T> {
protected HashMap<String, Something<T>> map = new HashMap<String, Something<T>>();
public void add(final String key, final Something<? extends T> o) {
map.put(key, o); // <--- here
}
public Something<T> get(final String key) {
return map.get(key);
}
}
Dies schlägt fehl, da Sie keine Something<? extends T>
zu einem Map<X, Something<T>>
hinzufügen können. Also lassen Sie uns dies ändern:
public static class ManagerImplementation<T> implements Manager<T> {
protected HashMap<String, Something<? extends T>> map = new HashMap<String, Something<? extends T>>();
public void add(final String key, final Something<? extends T> o) {
map.put(key, o);
}
public Something<T> get(final String key) {
return map.get(key); // <--- here
}
}
Dies schlägt fehl, da map.get(key)
kehrt Something<? extends T>
während die get-Funktion erforderlich ist Something<T>
zurückzukehren, wie es in der Schnittstelle definiert.
Was ist der übliche Ansatz, um dies zu lösen?
Danke!
Warum können Sie die get-Methode in der Schnittstelle zum 'öffentlichen Etwas extends T> get (final String key) nicht ändern,' auch? –
@HariShankar dies wird 'Something extends T>' zurückgeben, so dass OP nicht in der Lage sein wird, irgendwas über eine solche Referenz zu 'setzen' (außer' null'). – Pshemo