我想创建一个使用类作为键来返回该类实例的映射.就像是:
<T> Map< Class<T>, T > instanceMap = new HashMap< Class<T>, T > ();
instanceMap.put( Boolean.class, Boolean.TRUE );
instanceMap.put( String.class, "asdf" );
instanceMap.put( Integer.class, 11 );
Boolean b = instanceMap.get( Boolean.class );
Integer i = instanceMap.get( Integer.class );
String s = instanceMap.get( String.class );
Run Code Online (Sandbox Code Playgroud)
这可能吗?我有一种感觉,不是不是因为我无法表明它T是一个泛型类型而不是一个名为"T"的类.感觉有点像"高阶泛型".
编辑:我知道我可以尝试扩展Map并实现我自己的包装器等,但我特别要求使用Java的通用支持来做这个.我对这个想法更感兴趣,而不是这个特殊情况.
编辑2:如下所述,这是问题的重复(或更具体地说是子案例):Java地图,其值受键的类型参数限制.如果我能够找到那样雄辩的措辞,我可能会找到答案而不是发布这个.
fyr*_*fyr 13
你的意思是这样的?
public class Favorites {
private Map<Class<?>, Object> favorites =
new HashMap<Class<?>, Object>();
public <T> void setFavorite(Class<T> klass, T thing) {
favorites.put(klass, thing);
}
public <T> T getFavorite(Class<T> klass) {
return klass.cast(favorites.get(klass));
}
public static void main(String[] args) {
Favorites f = new Favorites();
f.setFavorite(String.class, "Java");
f.setFavorite(Integer.class, 0xcafebabe);
String s = f.getFavorite(String.class);
int i = f.getFavorite(Integer.class);
}
}
Run Code Online (Sandbox Code Playgroud)
参见参考:Java映射,其值受键的类型参数限制
据我了解,您是说在创建此地图后,您想要用诸如...之类的内容填充它。
f.put(String.class, "Hello");
f.put(Integer.class, new Integer(42));
f.put(x.getClass(), x);
Run Code Online (Sandbox Code Playgroud)
等等,对吗?
在这种情况下,我认为答案是否定的,你不能用泛型来做到这一点。泛型表示,对于类的给定实例(本例中为映射),您正在指定适用的类型。因此,如果您说new HashMap<String,Integer>;,则表示针对此映射的所有操作都将使用字符串键和整数值。但这不是您在本例中想要做的。您希望能够将任何类型的对象放入类中,然后根据对象的类型限制键的可接受类型。这不是泛型的工作原理。它们之间不是相互关系,对于任何给定实例来说它们都是常数。
当然,您可以创建这样的地图new HashMap<Class,Object>;。这不会强制该类成为相应对象的类,但它允许您输入此类值。
除此之外,我想你还需要一个包装纸。我是否应该指出,包装器的 put 仅需要一个参数,因为它可以通过getClass()对其进行操作来确定参数的类,因此无需告诉它?
| 归档时间: |
|
| 查看次数: |
11054 次 |
| 最近记录: |