我有一个Map
键是泛型类型Key<T>
,值是类型List<T>
.如果密钥是实例Key<String>
,则该值必须为a List<String>
,并且相同的规则适用于任何其他键值对.我尝试了以下但它不编译:
Map<T, List<T>> map;
Run Code Online (Sandbox Code Playgroud)
目前我必须用"部分"泛型来声明它:
Map<Object, List> map;
Run Code Online (Sandbox Code Playgroud)
我知道这很糟糕,但我目前没有更好的选择.在这种情况下是否可以使用泛型?
UPDATE
也许我没有清楚地表达我的问题.我想要一张能够:
map.put(new Key<String>(), new ArrayList<String>());
map.put(new Key<Integer>(), new ArrayList<Integer>());
Run Code Online (Sandbox Code Playgroud)
并且以下代码不应该编译:
map.put(new Key<String>(), new ArrayList<Integer>());
Run Code Online (Sandbox Code Playgroud)
键和值应始终具有相同的泛型类型,而泛型类型可以是任何类型,显然扩展映射不符合我的要求.
我不知道任何现有的库正是如此,但实现起来并不难.我过去做过几次类似的事情.您不能使用标准的Map接口,但可以在里面使用哈希映射来实现您的类.首先,它可能看起来像这样:
public class KeyMap {
public static class Key<T> { }
private final HashMap<Object,List<?>> values = new HashMap<Object,List<?>>();
public <T> void put(Key<T> k, List<T> v) {
values.put(k, v);
}
public <T> List<T> get(Key<T> k) {
return (List<T>)values.get(k);
}
public static void main(String[] args) {
KeyMap a = new KeyMap();
a.put(new Key<String>(), new ArrayList<String>());
a.get(new Key<Integer>());
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12247 次 |
最近记录: |