【发布时间】:2012-05-08 22:28:17
【问题描述】:
我有一个包含一组单例通配符类型的类,例如:
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);
}
我四处寻找,但找不到完全消除我困惑的答案。
【问题讨论】:
-
你有没有考虑像
ObliviousClass<T>那样为你的类添加一个泛型类型? -
这样做会阻止我将 Type
和 Type 添加到集合中。类 Type 有一个泛型类型,允许客户在使用它时有一些必要的灵活性,但 ObliviousClass 只负责维护对每个类的引用,而不直接对它们做任何事情。因此,将它们保持为通配符类型对我来说似乎很合适,但检索它们是我的问题。
标签: java generics wildcard generic-collections