我有一个带有单例通配符类型集合的类,例如:
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;
}
}
我希望能够在客户端代码中向此集合添加不同的参数化类型:
void clientMethod(){
ObliviousClass oc = ObliviousClass.getInstance();
Type<Integer> intType = ...
Type<String> 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<T>
,因为这样我上面的客户端代码就不起作用了......
我想做的事情有更好的设计吗? -我目前的解决方案是为客户端提供静态方法;类似于:
public static <T> void getType(ObliviousClass instance, Key key, Type<T> dest){
dest = (Type<T>)instance.getType(key);
}
我四处搜寻,但找不到完全消除我困惑的答案。