set*_*hro 8 java generics wildcard generic-collections
我有一个带有通配符类型集合的类,它是一个单例,类似于:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我希望能够在客户端代码中为此集合添加不同的参数化类型:
void clientMethod(){
ObliviousClass oc = ObliviousClass.getInstance();
Type<Integer> intType = ...
Type<String> stringType = ...
oc.putType(new Key(0), intType);
oc.putType(new Key(1), stringType);
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,据我所知,一切都很好.但是客户还需要能够获得Type<?>
提供的服务Key
.因此,将添加以下类似的方法ObliviousClass
:
public Type<?> getType(Key key){
return map.get(key);
}
Run Code Online (Sandbox Code Playgroud)
但是在我有用的Java副本中,我读到:
不要将通配符类型用作返回类型.
我理解这个问题,因为客户端必须抛出返回的内容Type<?>
.但我真的不想制作ObliviousClass
通用类型ObliviousClass<T>
,因为那时我的客户端代码不起作用......
对于我想要做的事情,有更好的设计吗? - 我目前的解决方案是为客户提供静态方法; 类似的东西:
public static <T> void getType(ObliviousClass instance, Key key, Type<T> dest){
dest = (Type<T>)instance.getType(key);
}
Run Code Online (Sandbox Code Playgroud)
我四处搜寻,但未能找到完全清除我困惑的答案.
这是一种在地图中存储给定类型的多个实例的类型安全方法.关键是您需要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));
}
}
Run Code Online (Sandbox Code Playgroud)
用法如下所示:
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 */
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9587 次 |
最近记录: |