避免返回通配符类型

2024-01-24

我有一个类,其中包含单例通配符类型的集合,如下所示:

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);
}

我四处寻找,但找不到完全消除我困惑的答案。


这是一种在映射中存储给定类型的多个实例的类型安全方法。关键是你需要提供一个Class检索值以执行运行时类型检查时的实例,因为静态类型信息已被删除。

class ObliviousClass {

  private final Map<Key, Object> map = new HashMap<Key, Object>();

  public Object put(Key key, Object value)
  {
    return map.put(key, value);
  }

  public <T> T get(Key key, Class<? extends T> type)
  {
    return type.cast(map.get(key)); 
  }

}

用法如下:

oc.put(k1, 42);
oc.put(k2, "Hello!");
...
Integer i = oc.get(k1, Integer.class);
String s = oc.get(k2, String.class);
Integer x = oc.get(k2, Integer.class); /* Throws ClassCastException */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

避免返回通配符类型 的相关文章

随机推荐