北京北大青鸟学校学术部讲解:Java泛型用法的例子

北京北大青鸟学校学术老师介绍:泛型的许多最佳例子都来自集合框架,因为泛型让大家在保存在集合中的元素上指定类型约束。考虑这个使用 Map 类的例子,其中涉及一定程度的优化,即 Map.get() 返回的结果将确实是一个 String:(北大青鸟课程


Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");


北京北大青鸟学校学术老师介绍:如果有人已经在映射中放置了不是 String 的其他东西,上面的代码将会抛出 ClassCastException。泛型允许您表达这样的类型约束,即 m 是一个将 String 键映射到 String 值的 Map。这可以消除代码中的强制类型转换,同时获得一个附加的类型检查层,这个检查层可以防止有人将错误类型的键或值保存在集合中。(北大青鸟课程


下面的代码示例展示了 JDK 5.0 中集合框架中的 Map 接口的定义的一部分:


public interface Map<K, V> {
public void put(K key, V value);
public V get(K key);
}(北大青鸟课程

注意该接口的两个附加物:

类型参数 K 和 V 在类级别的规格说明,表示在声明一个 Map 类型的变量时指定的类型的占位符。

在 get()、put() 和其他方法的方法签名中使用的 K 和 V。

为了赢得使用泛型的好处,必须在定义或实例化 Map 类型的变量时为 K 和 V 提供具体的值。以一种相对直观的方式做这件事:

Map<String, String> m = new HashMap<String, String>();
m.put("key", "blarg");
String s = m.get("key");(北大青鸟课程

当使用 Map 的泛型化版本时,您不再需要将 Map.get() 的结果强制类型转换为 String,因为编译器知道 get() 将返回一个 String。

北京北大青鸟学校学术老师提出,在使用泛型的版本中并没有减少键盘录入;实际上,比使用强制类型转换的版本需要做更多键入。使用泛型只是带来了附加的类型安全。因为编译器知道关于您将放进 Map 中的键和值的类型的更多信息,所以类型检查从执行时挪到了编译时,这会提高可靠性并加快开发速度。(北大青鸟课程


向后兼容

在 Java 语言中引入泛型的一个重要目标就是维护向后兼容。尽管 JDK 5.0 的标准类库中的许多类,比如集合框架,都已经泛型化了,但是使用集合类(比如 HashMap 和 ArrayList)的现有代码将继续不加修改地在 JDK 5.0 中工作。当然,没有利用泛型的现有代码将不会赢得泛型的类型安全好处。(北京北大青鸟学校编辑,未完待续)

 

北大青鸟网上报名
北大青鸟招生简章