java里程碑之泛型--深入理解泛型
所谓泛型,就是允许在定义类,接口,方法时使用类型形参,这个类型形参将在声明变量,创建对象,调用方法的时候动态的指定。JAVA5之后修改了集合中所有的接口和类,为这些接口和类都提供了泛型的支持。
关于泛型的底层,我们先来看看一段代码:
public class Test
{
public static void main(String[] args)
{
List<String> strList = Lists.newArrayList();
List<Integer> intList = Lists.newArrayList();
System.out.println(strList.getClass() == intList.getClass());
}
}
上面的代码new了2个list,然后判断这2个list的类是不是同一个?如果没有深入的了解过泛型,我们很容易以为上面的代码输出是false,但是运行上面的代码,实际输出是true。为什么呢?因为不管泛型的实际类型是什么,他们在运行时总是同样的类。比如下面的代码:
public class Test<T>
{
public static void main(String[] args)
{
Test<String> test = new Test<>();
List<String> strList = Lists.newArrayList();
List<Integer> intList = Lists.newArrayList();
System.out.println(strList.getClass() == intList.getClass());
}
}
我们在编译之后,用反编译打开jar包看一下,代码的源码如下:
public class Test<T>
{
public static void main(String[] args)
{
Test test = new Test();
List strList = Lists.newArrayList();
List intList = Lists.newArrayList();
System.out.println(strList.getClass() == intList.getClass());
}
}
从上面的2段代码我们得出一个结论,不管为泛型的类型形参传入哪一种类型实参,对于java来说,他们都被当成了同一个类来处理,在内存中也使用同一块内存空间。所以这里有2个注意的地方;
1),在静态方法,静态初始化块,静态变量的声明和初始化中都不允许使用类型形参。具体看下面的代码演示:
public class Test<T>
{
//实例属性,实例方法是可以的,具体的T就是初始化这个类时候传入的形参。以下代码正常
T name;
public void test(T id)
{ }
//静态属性和静态方法不可以用,这个时候没有实例初始化,也就是说这个T很有可能还没有传入。以下代码出错
static T id;
public static void test(T id)
{ }
}
2),在系统中并不会生成泛型类,所以instanceof运算符后不能使用泛型类。具体看下面的代码演示:
public class Test<T>
{
public void test()
{
Collection<String> list = Lists.newArrayList();
//下面代码正常
if (list instanceof ArrayList)
{ }
//下面代码报错,instanceof运算符后不能使用泛型
if (list instanceof ArrayList<String>)
{ }
}
}
总结:我们在使用泛型的时候,虽然程序只定义了一个List<E>的接口,但是在实际使用过程中我们可以传入随便的E的类型,这样子就可以产生无数多个List接口,只要为E传入不同的类型实参,系统就会多出一个新的List子接口。特别要注意的是,上面的任何一个子接口都不能被替换成一个固定的接口,比如List<String>不会替换成ListString,系统没有进行源代码复制,二级制代码中没有,磁盘和内存中都没有,也就是说这种子类我们只是可以这样子理解,但是在物理上根本不存在。
java里程碑之泛型--深入理解泛型的更多相关文章
- Java泛型深入理解
泛型的优点: 泛型的主要优点就是让编译器保留參数的类型信息,执行类型检查,执行类型转换(casting)操作,编译器保证了这些类型转换(casting)的绝对无误. /******* 不使用泛型类型 ...
- Java基础 -- 深入理解泛型
一般的类和方法,只能使用具体的类型:要么是基本类型,要么是自定义的类.如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚就会很大. 而泛型很好的解决了这个问题,这也是Java SE5的重大 ...
- java泛型的理解
总体介绍泛型: 1.泛型是计算机程序中一种重要的思维方式,它将数据结构和算法与数据类型相分离,使得同一套数据结构和算法,能够应用于各种数据类型,而且还可以保证类型安全,提高可读性.在Java中,泛型广 ...
- Java泛型深入理解(转载)
原文地址 http://blog.csdn.net/sunxianghuang/article/details/51982979 泛型之前 在面向对象编程语言中,多态算是一种泛化机制.例如,你可以将 ...
- 你对Java泛型的理解够深入吗?
泛型 泛型提供了一种将集合类型传达给编译器的方法,一旦编译器知道了集合元素的类型,编译器就可以对其类型进行检查,做类型约束. 在没有泛型之前: /** * 迭代 Collection ,注意 Coll ...
- 重读《深入理解Java虚拟机》六、Java泛型 VS C#泛型 (伪泛型 VS 真泛型)
一.泛型的本质 泛型是参数化类型的应用,操作的数据类型不限定于特定类型,可以根据实际需要设置不同的数据类型,以实现代码复用. 二.Java泛型 Java 泛型是Java1.5新增的特性,JVM并不支持 ...
- 关于Java泛型深入理解小总结
1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声 ...
- 通过Java反射来理解泛型的本质
集合框架中经常会使用泛型指定集合中所存放元素的类型,保证集合的统一性,从集合中取出元素的时候也避免了类型强制转换的操作,所以我们使用常规的方式来往集合中存放元素的时候,如果指定泛型,那么我们只能向集合 ...
- 《徐徐道来话Java》(2):泛型和数组,以及Java是如何实现泛型的
数组和泛型容器有什么区别 要区分数组和泛型容器的功能,这里先要理解三个概念:协变性(covariance).逆变性(contravariance)和无关性(invariant). 若类A是类B的子类, ...
随机推荐
- sqlite ef6
参考文章: http://www.cnblogs.com/adswads/p/3808549.html 用NUGET 引用 System.Data.SQLite.EF6 app.config 会有默 ...
- .NET Core单文件发布静态编译AOT CoreRT
.NET Core单文件发布静态编译AOT CoreRT,将.NET Core应用打包成一个可执行文件并包含运行时. 支持Windows, MacOS and Linux x64 w/ RyuJIT ...
- 6.while loop
while 循环 有时候我们不确定需要循环几次.就像一个司机不知道自己需要什么时候加油一样.程序可以这样写: while petrol_filling: increase price show ...
- ssm工程集成mybatis分页插件pagehelper
1 首先需要在mybatis的配置文件SqlMapConfig.xml文件中配置pagehelper插件 <plugins> <plugin interceptor=" ...
- 使用jemeter手工编写注册、登陆脚本 运用 fiddler (一)
我们要使用jemeter来手工写一个脚本 我们要使用到两个工具 一个 就是 jmeter 一个就是 fiddler 为什么要使用fiddler ? 因为能够帮我们正确精准的找到我们需要的数据 ...
- Spring mvc之 发邮件(qq.163...)
一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...
- 【margin和padding的区别】
margin和padding的区别 margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离.(外边距) padding是指自身边框到自身内部另一个容器边框之间的距离,就是容器内距离.(内 ...
- AtCoder Grand Contest 017
noi前橙名计划失败.全程搞C而gg…… A - Biscuits 题意:背包,求价值为奇/偶的方案数. #include<cstdio> #include<queue> #i ...
- BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】
3038: 上帝造题的七分钟2 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1469 Solved: 631[Submit][Status][Dis ...
- ACM_并查集
//题意:ignatius过生日,客人来到,他想知道他需要准备多少张桌子.然而一张桌子上面只能坐上相互熟悉的人, //其中熟悉可定义成为A与B认识,B与C认识,我们就说A,B,C相互熟悉 .例如A与B ...