文档章节

为什么要使用泛型?

天王盖地虎626
 天王盖地虎626
发布于 06/18 22:35
字数 1003
阅读 9
收藏 0

为什么要使用泛型

  通过泛型可以定义类型安全的数据结构(类型安全),而无须使用实际的数据类型(可扩展)。这能够显著提高性能并得到更高质量的代码(高性能),因为您可以重用数据处理算法,而无须复制类型特定的代码(可重用)。在概念上,泛型类似于 C++ 模板,但是在实现和功能方面存在明显差异。

  考虑一种普通的、提供传统 Push() 和 Pop() 方法的数据结构(例如,堆栈)。在开发通用堆栈时,您可能愿意使用它来存储各种类型的实例。您可以使用基于 Object 的堆栈,这意味着,在该堆栈中使用的内部数据类型是难以归类的 Object,并且堆栈方法与 Object 交互:

  

  上述容器可按下述方式使用:

  

  基于 Object 的解决方案存在两个问题。

  第一个问题是性能。在使用值类型时,必须boxing & unboxing。装箱和取消装箱都会根据它们自己的权限造成重大的性能损失,但是它还会增加托管堆上的压力,导致更多的垃圾收集工作,而这对于性能而言也不太好。即使是在使用引用类型而不是值类型时,仍然存在性能损失,这是因为必须从 Object 向您要与之交互的实际类型进行强制类型转换,从而造成强制类型转换开销。

  基于 Object 的解决方案的第二个问题(通常更为严重)是类型安全。因为编译器允许在任何类型和 Object 之间进行强制类型转换,所以您将丢失编译时类型安全。例如,以下代码可以正确编译,但是在运行时将引发无效强制类型转换异常:  

  

  您可以通过提供类型特定的(因而是类型安全的)高性能堆栈来克服上述两个问题。对于整型,可以实现并使用 IntStack。对于字符串,可以实现 StringStack。

  遗憾的是,以这种方式解决性能和类型安全问题,会引起第三个同样严重的问题 — 影响工作效率(无法重用)。编写类型特定的数据结构是一项乏味的、重复性的且易于出错的任务。在修复该数据结构中的缺陷时,您不能只在一个位置修复该缺陷,而必须在实质上是同一数据结构的类型特定的副本所出现的每个位置进行修复。此外,没有办法预知未知的或尚未定义的将来类型的使用情况,因此还必须保持基于 Object 的数据结构。

【什么是泛型】

  

  在一些 C++ 编译器中,在您通过特定类型使用模板类之前,编译器甚至不会编译模板代码。当您确实指定了类型时,编译器会以内联方式插入代码,并且将每个出现一般类型参数的地方替换为指定的类型。此外,每当您使用特定类型时,编译器都会插入特定于该类型的代码,而不管您是否已经在应用程序中的其他某个位置为模板类指定了该类型。C++ 链接器负责解决该问题,并且并不总是有效。这可能会导致代码膨胀,从而增加加载时间和内存足迹。

【一些泛型应用】

  

本文转载自:https://www.cnblogs.com/tekkaman/p/3920269.html

天王盖地虎626

天王盖地虎626

粉丝 32
博文 527
码字总数 20708
作品 0
南京
私信 提问
JAVA泛型方法

今天在看Hibernate的时候,发现底层的方法都是用泛型来写的,突然意识到我对泛型的理解不是那么深入。看了一上午的泛型,弄明白了两个问题。 什么时候定义泛型方法 无论何时,只要你能做到,...

zdatbit
2016/03/11
60
0
java核心基础 --- 泛型

本篇博文主要介绍两部分,为什么要有泛型以及泛型擦除这个概念,如果你想要了解泛型的具体使用,请查看相关书籍或者其他博客。 为什么要有泛型 来看看官方文档给的解释: Code that uses gen...

firepation
01/25
20
0
关于JFinal的小问题

这是Model类的定义, 此处为什么要使用泛型? 为什么不直接这样? 区别不大,不过使用的时候, 直接xxx extends Model即可 ,而不是xxx extends Model. 我觉得似乎完全没必要,此处的泛型M, 用M...

幻影浪子
2012/12/14
284
7
【Java基础篇二】——你真的懂泛型吗?

前言 泛型在代码之初就一直在使用,而且使用的时候一直和集合一起用,对他的理解非常片面,只知道它对编译时集合元素的类型进行检查,但是对于为什么这么使用,以及什么情况下可以使用泛型却...

changyinling520
2018/05/31
0
0
泛型的内部原理:类型擦除以及类型擦除带来的问题

参考:java核心技术 一、Java泛型的实现方法:类型擦除 Java的泛型是伪泛型。为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理...

小菜鸡1
2016/07/27
489
1

没有更多内容

加载失败,请刷新页面

加载更多

shangcheng-my

1.数据库主键、外键类型为bigint,那么在后台应该用什么类型的变量定义? 后台用string接收,因为前段传过来的一般都是json字符串,后台直接接收,mysql是可以吧数字类型的字符串转换为对应的...

榴莲黑芝麻糊
昨天
2
0
微服务架构依赖图

基于spring-cloud-alibaba + dubbo

龙影
昨天
5
0
Centos7 安装zabbix-agent

rpm -i https://repo.zabbix.com/zabbix/4.2/rhel/6/x86_64/zabbix-release-4.2-2.el6.noarch.rpm 可以到https://repo.zabbix.com/zabbix找到对应的版本 yum install zabbix-agent -y 出现E......

abowu
昨天
8
0
文本编辑器GNU nano 4.4 发布

GNU nano 4.4 "Hagelslag" 更新日志: 启动时,光标可以放在第一个或最后一个出现位置 字符串前面带有+/string 或 +?string的字符串。 发生自动硬包装时((--breaklonglines),任何前导引号...

linuxCool
昨天
7
0
你知道字节序吗

字节序 最近在调一个自定义报文的接口时,本来以为挺简单的,发现踩了好几个坑,其中一个比较“刻骨铭心”的问题就是数据的字节序问题。 背景 自定义报文,调用接口,服务端报文解析失败 iO...

杭城小刘
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部