您不能将类型变量声明为两种类型中的任何一种。但是您可以创建一个辅助类来封装没有公共构造函数但具有专用类型的工厂方法的值:
public static final class Value {
private final Object value;
private Value(Object o) { value=o; }
}
public static Value value(int i) {
// you could verify the range here
return new Value(i);
}
public static Value value(String s) {
// could reject null or invalid string contents here
return new Value(s);
}
// these helper methods may be superseded by Java 9’s Map.of(...) methods
public static <K,V> Map<K,V> map(K k, V v) { return Collections.singletonMap(k, v); }
public static <K,V> Map<K,V> map(K k1, V v1, K k2, V v2) {
final HashMap<K, V> m = new HashMap<>();
m.put(k1, v1);
m.put(k2, v2);
return m;
}
public static <K,V> Map<K,V> map(K k1, V v1, K k2, V v2, K k3, V v3) {
final Map<K, V> m = map(k1, v1, k2, v2);
m.put(k3, v3);
return m;
}
public void setProperties(Map<String, Value> properties) {
Map<String,Object> actual;
if(properties.isEmpty()) actual = Collections.emptyMap();
else {
actual = new HashMap<>(properties.size());
for(Map.Entry<String, Value> e: properties.entrySet())
actual.put(e.getKey(), e.getValue().value);
}
// proceed with actual map
}
如果您使用带有地图构建器的 3rd 方库,则不需要这些map
方法,它们仅适用于短地图。使用这种模式,您可以调用类似的方法
setProperties(map("mapLength", value(2), "timezone", value("UTC")));
由于and只有两个Value
工厂方法,因此不能将其他类型传递给映射。请注意,这也允许使用as 参数类型,因此可以在此处扩展等。int
String
int
byte
short
int