##1.没有泛型之前
程序员为了使程序更为通用,传入的值和返回值通常以Object类型为主。当时用这些实例时必须正确的转换为原来的类型,否则会抛出ClassCastException异常。
package day21;
class Demo{
private Object b;
public Object getB() {
return b;
}
public void setB(Object b) {
this.b = b;
}
}
public class TestDemo {
public static void main(String[] args) {
Demo d = new Demo();
d.setB(new Float(2.2f));
Float f = (Float)(d.getB());
System.out.println(f);
}
}
运行结果:
public class TestDemo {
public static void main(String[] args) {
Demo d = new Demo();
d.setB(new Float(2.2f));
Integer i = (Integer)(d.getB());
System.out.println(i);
}
}
运行结果:
而在JDK1.5泛型机制诞生之后我们可以通过泛型这样实现上述代码
class Demo<T>{
private T b;
public T getB() {
return b;
}
public void setB(T b) {
this.b = b;
}
}
public class TestDemo {
public static void main(String[] args) {
Demo<Float> d = new Demo<Float>();
d.setB(new Float(2.2f));
Float f = d.getB();
System.out.println(f);
}
}
运行结果:
从述代码可以看出使用泛型定义的类在声明该类对象时可以根据不同需求指定真正类型,而在实用类的方法传递和返回数据类型时不再需要类型转换,且不会发生抛出异常,因为便以其中可以检查类型匹配是否正确。
所以泛型存在有两个意义:
######1.自动类型转换
######2.自动类型匹配
##2.泛型的上界
java中默认任何类型来实例化一个泛型对象,但也通过边界对泛型类实例化进行了限制。
class 类名< T extends anyClass >
anyClass指某个类或接口
对泛型设定边界后,泛型的类型必须继承了anyClass这个接口或类。无论anyclass是接口还是类,再进行泛型限制时都必须使extends关键字。
public class LimitClass< T extends List> {
public static void main(String[] args) {
LimitClass<ArraList> l1 = new LimitClass<ArraList>();
LimitClass<LinkedList> l2 = new LimitClass<LinkedList>();
//LimitClass<HashMap> l3 = new LimitClass<HashMap>();
//这句语句是错误的,因为HashMap没有实现list()接口
}
}
例子中,LinkedList,LinkList都实现了List接口,而HashMap没有实现List接口所以不能实例化HashMap的对象
##3.通配符
通配符声明的名称实例化的对象不能加入新的信息,只能获取或删除
public static void main(String[] args) {
Demo<Float> d1 = new Demo<Float>();
Demo<?> d2 = new Demo<Float>();
d1.setB(new Float(2.2f));
//d2.setB(new Float(2.2f));
//使用通配符的对象调用set()方法不能被调用
d1.getB();
d2.getB();//可以获取
}
通配符可以有下界
A<? super B> a = null;
这样定义后,对泛型进行了向上限制,a只接受B接口或上层父类类型。
##4.泛型的缺陷
###不能重载
class C <A,B>{
public void D(A a){}
//public void D(B b){}
//A,B再累的内部被当做Object因此不能重载
}
###内存泄漏
测试内存泄漏的方法
system.gc
1.jps 获得当前进程号
2.jmap - histo:live 进程号>log.txt
3.start log.txt
4.查看要看的类实例个
##5.泛型的使用总结
1.不能new泛型类型的数组
2.不能new泛型类型的对象
3.不能得到泛型对象的数组
4.简单类型不能作为泛型的擦除
5.在static方法当中不能用泛型类型的参数