映射<Class <?>,Object> registry

Rob*_*ino 1 java generics collections guava

我需要将测试值放在一个类中,就像在这个简化的例子中一样:

import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class TestVal {
  private static Map<Class<?>, Object> dummyValues = Maps.newHashMap();
  static {
    dummyValues.put(String.class, "Banana");
    dummyValues.put(Integer.class, 42);
  }
  @SuppressWarnings("unchecked")
  static final <T> T ofType(Class<T> type) {
    return (T) dummyValues.get(type);
  }
  public static void main(String[] args) {
    List<? extends Object> list =
        Lists.newArrayList(ofType(String.class), ofType(Integer.class));
    for (Object object : list) {
      System.out.printf("%s: %s%n", object, object.getClass().getName());
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

一旦运行,它给了我:

Banana: java.lang.String
42: java.lang.Integer
Run Code Online (Sandbox Code Playgroud)

所以它作为一个"基本"系统很好.

我想要更多类型安全.

我试图研究番石榴ImmutableClassToInstanceMap但是......我发现它有点困难,看看这个方法签名:

public static
    <B, S extends B>
        ImmutableClassToInstanceMap<B>
            copyOf(
                Map<? extends Class<? extends S>,
                ? extends S> map
            )
Run Code Online (Sandbox Code Playgroud)

野蛮,不是吗?我如何将它用于"任何"类型?没有在Google的Wiki上看到一个例子..

我可以像上面那样"一步到位"而不"一路走"吗?我错过了另一种明显的方法吗?

Lou*_*man 8

嗯?所有你需要做的ImmutableClassToInstanceMap就像是

ImmutableClassToInstanceMap<Object> map = ImmutableClassToInstanceMap
  .builder()
  .put(String.class, "foo")
  .put(Integer.class, 42)
  .build();
Run Code Online (Sandbox Code Playgroud)

然后你只需要打电话map.getInstance(String.class)就可以了String.

泛型copyOf()是复杂但必要的,但对于这种情况,你几乎肯定会想要使用构建器.