Как избежать возврата типов с подстановочными знаками

У меня есть класс с набором подстановочных типов, который является синглтоном, что-то вроде:

public ObliviousClass{

    private static final ObliviousClass INSTANCE = new ObliviousClass();

    private Map> map = new HashMap>();

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

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

}

Я хотел бы иметь возможность добавлять в этот набор различные параметризованные типы в клиентском коде:

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

    Type intType = ...
    Type stringType = ...

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

До этого момента, как я понимаю, все ок. Но клиент также должен иметь возможность получить Type>при наличии Key. Таким образом, в ObliviousClassбудет добавлен метод, подобный следующему:

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

Но в моей удобной копии Effective Javaя прочитал:

Не используйте подстановочные знаки в качестве возврата типы.

Я понимаю проблему, так как клиент должен был бы привести возвращенный Type>. Но я действительно не хочу делать ObliviousClassуниверсальным типом, ObliviousClass, потому что тогда мой клиентский код выше не будет работать...

Есть ли лучший дизайн для чего я пытаюсь сделать? -Мое текущее решение состоит в том, чтобы предоставить статический метод для клиента; что-то вроде:

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

Я искал вокруг, но не смог найти ответ, который полностью развеял бы мое замешательство.

8
задан sethro 8 May 2012 в 23:18
поделиться