Die Vermeidung Der Rückkehr Wildcard-Typen

Habe ich eine Klasse mit einer Sammlung von Wildcard-Typen, die ein singleton ist, so etwas wie:

public ObliviousClass{

    private static final ObliviousClass INSTANCE = new ObliviousClass();

    private Map<Key, Type<?>> map = new HashMap<Key, Type<?>>();

    public void putType(Key key, Type<?> type){
        map.put(type);
    }

    //returns the singleton
    public static ObliviousClass getInstance(){
        return INSTANCE;
    }

}

Ich würde gerne in der Lage, zum hinzufügen von verschiedenen Parametrisierten Typen, die zu dieser Kollektion, die im client-code:

void clientMethod(){
    ObliviousClass oc = ObliviousClass.getInstance();

    Type<Integer> intType = ...
    Type<String> stringType = ...

    oc.putType(new Key(0), intType);
    oc.putType(new Key(1), stringType);
}

Bis zu diesem Punkt, so wie ich es verstehe, ist alles ok. Aber ein client muss in der Lage sein zu Holen ein Type<?> sofern die Key. So eine Methode ist etwas wie die folgende hinzu käme ObliviousClass:

public Type<?> getType(Key key){
    return map.get(key);
}

Aber in mein handy kopieren von Effektive Java, ich lese:

Verwenden Sie keine wildcard-Typen als Rückgabewerte.

Ich verstehe das Problem, wie der client müsste Besetzung der zurückgegebenen Type<?>. Aber ich möchte wirklich nicht zu machen ObliviousClass einen generischen Typ, ObliviousClass<T>, weil dann mein client-code oben nicht funktionieren würde...

Ist es besser, für das, was ich versuche zu tun?
-Meine aktuelle Lösung ist es, eine statische Methode für die client; etwas entlang der Linien von:

public static <T> void getType(ObliviousClass instance, Key key, Type<T> dest){
    dest = (Type<T>)instance.getType(key);
}

Suchte ich herum, aber war nicht in der Lage, eine Antwort zu finden, die ganz gelöscht meine Verwirrung.

  • haben Sie als Zugabe ein generischer Typ Sie Ihre Klasse, wie so ObliviousClass<T>?
  • Tun hemmen würde mich hinzufügen, sowohl des Typs<Integer> und Geben<String> in die Kollektion. Die Klasse Type<T> hat einen generischen Typ zu erlauben, den Kunden einige notwendige Flexibilität, es zu benutzen, aber ObliviousClass ist nur dafür zuständig, ein Verweis auf jeder und nicht alles tun, mit Ihnen, direkt. So pflegen Sie als wildcard-Typen geeignet scheint, für mich, aber abrufen, ist meine Frage.
  • Spät zur party, aber...
InformationsquelleAutor sethro | 2012-05-08
Schreibe einen Kommentar