使用泛型自动投射

使用泛型,可以返回调用者期望的任何内容:

private Map<String, Object> data;
public <T> T get(String key) {
    return (T) data.get(key);
}

该方法将编译并发出警告。代码实际上比它看起来更安全,因为 Java 运行时将在你使用时执行转换:

Bar bar = foo.get("bar");

使用泛型类型时安全性较低:

List<Bar> bars = foo.get("bars");

在这里,当返回的类型是任何类型的 List 时,类型转换都会工作(即返回 List<String> 不会触发 ClassCastException;当从列表中取出元素时,你最终会得到它)。

要解决此问题,你可以创建使用键入键的 API:

public final static Key<List<Bar>> BARS = new Key<>("BARS");

以及这个 put() 方法:

public <T> T put(Key<T> key, T value);

使用这种方法,你不能将错误的类型放入地图中,因此结果将始终正确(除非你不小心创建了两个具有相同名称但不同类型的键)。

有关: