我需要将测试值放在一个类中,就像在这个简化的例子中一样:
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());
}
}
}
,一旦运行,就会给我:
Banana: java.lang.String
42: java.lang.Integer
所以它作为一个“基本”系统很好。
我想要更多类型安全。
我正在尝试研究番石榴的ImmutableClassToInstanceMap
但是......我发现它有点困难,请看一下这个方法签名:
public static
<B, S extends B>
ImmutableClassToInstanceMap<B>
copyOf(
Map<? extends Class<? extends S>,
? extends S> map
)
残忍,不是吗?我如何将它用于“任何”类型?没有在Google的Wiki上看到一个例子..
我可以像上面的东西一样“一步到位”而不“一路走来”吗?我错过了另一种明显的做法吗?
答案 0 :(得分:8)
嗯?使用ImmutableClassToInstanceMap
所需要的只是
ImmutableClassToInstanceMap<Object> map = ImmutableClassToInstanceMap
.builder()
.put(String.class, "foo")
.put(Integer.class, 42)
.build();
然后您只需致电map.getInstance(String.class)
即可获得String
。
copyOf()
上的泛型是复杂但必要的,但对于这种情况,您几乎肯定只想使用构建器。