У меня есть класс с набором подстановочных типов, который является синглтоном, что-то вроде:
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);
}
Я искал вокруг, но не смог найти ответ, который полностью развеял бы мое замешательство.