在Java中,是否可以为类的实例创建类型安全的类映射?

Sle*_*led 9 java generics

我想创建一个使用类作为键来返回该类实例的映射.就像是:

<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映射,其值受键的类型参数限制


Jay*_*Jay 3

据我了解,您是说在创建此地图后,您想要用诸如...之类的内容填充它。

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()对其进行操作来确定参数的类,因此无需告诉它?