小编在学到数据结构时,真正接触到了泛型,相信很多小伙伴会和我一样好奇泛型是什么,从它字面的意思我们可知道泛型就是使用于许多的类型,从代码角度来说,就是对类型实现了参数化【例如,我们在写代码的时候,可能一时半会不知道返回值是什么类型的,我们可以用参数替代,留个空,真正使用的时候,根据不同的需要传入不同的类型,在传入时进行指定】。这样可以避免存放数据太乱,且避免了每次取数据都要强转【例如,定义了Object 类的数组在一个里,且类里含get、set方法,返回值用对应类型,数组元素为Object的子类类型,取出后需要向下型】。这样不太方便,此时泛型成为了解决问题的关键,泛型指定当前这个箱子持有什么样的类型对象,让编译器去检查类型,此时类型作为参数传递,需要什么类型,传入什么参数,即满足了据所需传入参数又满足了取出元素不需要转型,传时指定类型避免存放数据过乱。泛型【<E>占位符】的一般形式语法是:
1.class 泛型类的名字 <类型参数列表【常用E、K、V、N、T可自行查找这些是什么意思】>{
}
使用时:泛型类名<类型实参> 变量名=new 泛型类名<类型实参【前面写了类型实参后面尖括号里可以啥都不写】>();
2.//泛型方法
(前可写修饰限定符也可以不写) <E【参数】> E find(){ //这里返回值为E,<>里的E对应 传的参
}
3.//继承泛型类
class 泛型类名 <形参【E】> extends 继承的类名 <参数【E】>{
}//子类保留泛型,父随子动
class 泛型类名 extends 父泛型类名 <参数>{
}//子类不是泛型类
【<E>只是占位符,<>中内容可变,是形参】。
在深入了解它之前,我们先来了解包装类、拆箱、装箱,首先包装类,那么为什么要使用包装类,原因是Java中基本数据类型不是继承自Object,为了在有关泛型的代码里支持基本数据类型。Java给每一个基本数据类型对应了一个包装类【byte-Byte、short-Short、int-Integer、long-Long、float-Float、double-Double、char-Charater、boolean-Boolean】。接下来我们讲装箱与拆箱,装箱(装包)分为自动装箱与显示装箱。装箱就是把基本的数据类型变为包装类类型的过程,
1.int a=10;
(1)Integer b=Integer.valueOf(a);//显示装箱【直接调用Integer的valueOf()方法】
(2)Integer c=a;//自动装箱(隐式的)【底层也是调用Integer.valueOf()的方法】
拆箱(拆包)分为自动拆箱与显示拆箱,拆箱就是包装类变为基本数据类型的过程,
2.Integer a=12;
(1)int b=a;//自动拆箱【自动拆为整型】
int k=(int) a;//自动
(2)int c=a.intvalue();//显示拆箱【手动拆为整型】
【小贴士:装箱时用的valueOf()方法,其方法传入数大于缓存数组的最低值-128小于缓存数的最高值127时可在缓存数组里寻找【例如 Integer a=23 与Integer b=23用==比较时返回true】,否则返回新建的对象中】
现在我们该来讲讲泛型了,泛型中包含一种裸类型【也是一种泛型类,但没有带着类型实参】:My list=new My()[此时My是一个泛型类],使用泛型的优点:1.数据类型参数化 2.编译时自动进行类型检查与类型转换。
泛型是编译时期的一种机制,在运行时没有泛型的概念,这是为什么呢?这是因为编译中的擦除机制——编译完成后,E被擦除为Object,生成的字节码在运行期间不含泛型类型。那么Java是怎么擦除的呢?使用擦除机制在擦除过程:1.无界泛型擦除后变为Object 2.有界泛型擦除占位符替换为Number上界类型,接下来,我们聊聊泛型的上界。
泛型的上界:定义泛型类时有时需要传入类型变量做一定的约束,可通过类型的边界来约束【通过extends关键字限定泛型类型 E的取值范围】。
写法:class 泛型类名 <类型形参 extends 类型边界>{
}
例如:
1.class MyList< E extends Number>{ //此时规定传入的参数是Number或者是Number的 类,没指定类型边界区,可视为E extends Object
}
2.class MyList<E extends Comparable <E>>{ //此处是更为复杂的上界,此处E必须实现 Compareable<E>接口或本身是实现了Comparable<E>接口的子类型
}
以上便是小编对泛型的理解,若有误或那些需要改进的地方,望告知,小编可想进步了,感谢!!!
625

被折叠的 条评论
为什么被折叠?



