我有一个类,其中包含单例通配符类型的集合,如下所示:
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);
}
但在我手边的副本中有效的Java http://java.sun.com/docs/books/effective/, 我读:
不要使用通配符类型作为返回类型。
我理解这个问题,因为客户端必须转换返回的Type<?>
。但我真的不想让ObliviousClass
泛型类型,ObliviousClass<T>
,因为这样我上面的客户端代码将无法工作......
对于我想做的事情有更好的设计吗?-我目前的解决方案是为客户端提供静态方法;大致如下:
public static <T> void getType(ObliviousClass instance, Key key, Type<T> dest){
dest = (Type<T>)instance.getType(key);
}
我四处寻找,但找不到完全消除我困惑的答案。