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

2022-09-04 02:29:37

我想创建一个映射,该映射使用类作为键来返回该类的实例。像这样:

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

这可能吗?我有一种感觉,不,它不是因为我无法指出它应该是一个泛型类型,而不是一个名为“T”的类。它在某种程度上感觉像“高阶泛型”。T

编辑:我知道我可以尝试扩展Map并实现我自己的包装器等,但我特别要求仅使用Java的通用支持来执行此操作。我对这个想法更感兴趣,而不是这个特殊情况。

编辑2:如下所述,这是问题的重复(或更具体地说是子案例):具有受key类型参数限制的值的Java映射。如果我能够找到如此雄辩的措辞,我可能会找到那个答案,而不是发布这个。


答案 1

你的意思是这样的事情?

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

参见作为参考:具有受键的类型参数限制的值的Java映射


答案 2

据我所知,您是说在创建此地图后,您希望用类似的东西填充它...

f.put(String.class, "Hello");
f.put(Integer.class, new Integer(42));
f.put(x.getClass(), x);

等。右?

在这种情况下,我认为答案是否定的,你不能用泛型来做到这一点。泛型说,对于类的给定实例(在本例中为映射),您将指定适用的类型。因此,如果您说 ,则表示针对此映射的所有操作都将使用字符串的键和整数值。但在这种情况下,这不是你想做的。您希望能够将任何类型的对象放入类中,然后根据对象的类型约束键的可接受类型。这不是泛型的工作原理。它们不是彼此之间的关系,它们是任何给定实例的常量。new HashMap<String,Integer>;

当然,您可以创建这样的地图。这不会强制类成为相应对象的类,但它将允许您输入此类值。new HashMap<Class,Object>;

除此之外,我认为你需要一个包装器。我应该指出,包装器的 put 只需要一个参数,因为它可以通过在它上面做来确定参数的类,没有必要告诉它?getClass()


推荐