认识泛型数据
来源:互联网 发布:淘宝商家管理系统 编辑:程序博客网 时间:2024/06/07 01:25
1.什么是泛型?
泛型(Generictype或者 generics)是对 Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类。可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法的形式参数是运行时传递的值的占位符一样。
可以在集合框架(Collectionframework)中看到泛型的动机。例如,Map类允许您向一个 Map添加任意类的对象,即使最常见的情况是在给定映射(map)中保存某个特定类型(比如 String)的对象。
因为 Map.get()被定义为返回 Object,所以一般必须将Map.get()的结果强制类型转换为期望的类型,如下面的代码所示:
Map m = new HashMap();
m.put("key", "blarg");
String s = (String) m.get("key");
要让程序通过编译,必须将 get()的结果强制类型转换为 String,并且希望结果真的是一个 String。但是有可能某人已经在该映射中保存了不是 String 的东西,这样的话,上面的代码将会抛出 ClassCastException。
理想情况下,您可能会得出这样一个观点,即 m 是一个 Map,它将 String键映射到 String值。这可以让您消除代码中的强制类型转换,同时获得一个附加的类型检查层,该检查层可以防止有人将错误类型的键或值保存在集合中。这就是泛型所做的工作。
2.泛型的好处
Java语言中引入泛型是一个较大的功能增强。不仅语言、类型系统和编译器有了较大的变化,以支持泛型,而且类库也进行了大翻修,所以许多重要的类,比如集合框架,都已经成为泛型化的了。这带来了很多好处:
类型安全。泛型的主要目标是提高 Java程序的类型安全。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设。没有泛型,这些假设就只存在于程序员的头脑中(或者如果幸运的话,还存在于代码注释中)。
Java程序中的一种流行技术是定义这样的集合,即它的元素或键是公共类型的,比如“String列表”或者“String到 String的映射”。通过在变量声明中捕获这一附加的类型信息,泛型允许编译器实施这些附加的类型约束。类型错误现在就可以在编译时被捕获了,而不是在运行时当作 ClassCastException展示出来。将类型检查从运行时挪到编译时有助于您更容易找到错误,并可提高程序的可靠性。
消除强制类型转换。泛型的一个附带好处是,消除源代码中的许多强制类型转换。这使得代码更加可读,并且减少了出错机会。
尽管减少强制类型转换可以降低使用泛型类的代码的罗嗦程度,但是声明泛型变量会带来相应的罗嗦。比较下面两个代码例子。
该代码不使用泛型:
List li = new ArrayList();
li.put(new Integer(3));
Integer i = (Integer) li.get(0);
该代码使用泛型:
List<Integer> li = newArrayList<Integer>();
li.put(new Integer(3));
Integer i = li.get(0);
在简单的程序中使用一次泛型变量不会降低罗嗦程度。但是对于多次使用泛型变量的大型程序来说,则可以累积起来降低罗嗦程度。
潜在的性能收益。泛型为较大的优化带来可能。在泛型的初始实现中,编译器将强制类型转换(没有泛型的话,程序员会指定这些强制类型转换)插入生成的字节码中。但是更多类型信息可用于编译器这一事实,为未来版本的 JVM的优化带来可能。
由于泛型的实现方式,支持泛型(几乎)不需要 JVM 或类文件更改。所有工作都在编译器中完成,编译器生成类似于没有泛型(和强制类型转换)时所写的代码,只是更能确保类型安全而已。
3.泛型用法的例子
泛型的许多最佳例子都来自集合框架,因为泛型让您在保存在集合中的元素上指定类型约束。考虑这个使用 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 = newHashMap<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中工作。当然,没有利用泛型的现有代码将不会赢得泛型的类型安全好处。
- 认识泛型数据
- 认识数据
- 重新认识字符串和字符型数据
- 泛型简单认识
- 泛型的认识
- 了解认识泛型
- 认识泛型
- 数据恢复认识
- 数据驱动的认识
- 认识数据地图
- 认识大数据分析
- 数据分析师认识
- 认识大数据
- 认识大数据
- 第二章 认识数据
- 1、认识大数据
- 第二章 认识数据
- 认识大数据
- 关于vs调试正确。但是发布到iis就出现无法访问后天局面
- --------------------------------新博《大城小爱》分界线------------------------------------
- SRM553 Div1Medium TwoConvexShapes
- 由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
- SQL2012连接字符串
- 认识泛型数据
- Visio连接数据表实体外键[快捷记录]
- B 树、B+ 树、B* 树
- Hadoop-Streaming实战经验及问题解决方法总结
- 一点心得
- MVC 数据验证[转]
- 荷兰版《口袋妖怪GO》:不找小精灵,找免费啤酒!
- 何为REST
- 更改项目名或者多个项目时,发现多个"Home"匹配的Controller时,解决方法