------------------ <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、
<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
泛型:jdk1.5新特性,用于解决安全问题,是一个类型安全机制;明确表示你要向集合中装入那种类型的数据,无法加入指定类型以外的数据,
泛型是提供给java编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时,会去掉“类型”信息是程序不受影响,(运行期失效)
1好处:
1将运行时期出现的问题classCastException转移到了编译时期,方便与程序员解决问题,让运行时
问题减少,更安全;
2避免了强制转换的麻烦,泛型的补偿:在运行时通过获取元素的类型进行转换动作;(免强转)
泛型格式:通过<>来定义要操作的引用数据类型;通常在集合框架中很常见;<>就是用来接收泛型的;当使用集合时将集合中要存储的数据类型作为参数传递到<>中即可;
ArrrayList<String> al=newArrayList<String>();
2何时使用泛型:
当操作的引用数据类型不确定的时候,就使用<>将要操作的引用数据类型传入<>其实<>就是一个用于接收具体引用数据类型的参数范围;
泛型技术是给编译器使用的技术;用于编译时期,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,确保了类型的安全;运行时会将泛型去掉,生成的class文件中不带泛型的,这称之为泛型的檫除;擦出是为了兼容运行的类加载器;也可使程序运行效率不搜影响,
3泛型与反射:
对于参数化的泛型类型,getclass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型数据,用反射的到集合,在调用append()方法即可
4泛型的通配符:
?未知类型,使用?通配符可以引用其他各种参数化的类型,?通配符定义的变量主要用作引用,可以调用与参数无关的方法,不能调用与参数化有关的方法;(没理解清楚)
?通配符的扩展:
?extends XXX:限定通配符的上边界:
应用:Vector<? extends Number> v=new Vector<integer>(); //ok
Vector<? exends Number> v=newVector<String>(); //no ok
? super XXX :限定通配符的下边界:
应用:Vector<? super integer> v=nw Vector<Number>(); //ok
Vector<? super integer> v=newVector<Bute>(); //no ok
提示:限定通配符总是包括自己;
5泛型限定应用场景:
?extends E :接收E类型或者E的子类型对象,(即上限)一般存储对象的时候用,如添加;
?super E :接收E类型或者E的父类型对象,(即下限)一般用于取出对象时用;如比较器;
6泛型术语:
Arraylist<E>类定义和Arraylist<integer>类型引用中涉及如下术语,整个称为Arraylist<E>泛型类型Arraylist<E>中的E称为类型变量或类型参数,整个Arraylist<integer>称为参数化的类型,integer称为类型参数的实例或实际类型参数;<>念做typeOf,整个称为arraylist type of integer.Arraylist称为原始类型;
7泛型之参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象,编译报友好提示警告。
应用:collection<String> v=new Voctor(); //ok
原始类型可以引用一个参数化类型对象,编译报友好提示警告。
应用:collection col=new Voctor<String>(); //ok
8参数化类型的规范:
参数化类型不考虑类型参数的继承关系:
Vector<object> v=newVector<integet>(); //no ok
Vector<String> v=newVector<object>(); //no ok
在创建数组实例时,数组的元素不能使用参数化的类型;
Vector<object> v[]=newVector<object>[21]; //no ok
下面的代码是可行的,不报错:
Vector v1=new Vector<String>();
Vector<object>=v1;
9泛型集合类的综合案例:
HashMap<String,Integer> hm=newHashMap<String,Integer>();
hm.put(“zxx”,19);
hm.put(“lhm”18);
for ( Map.Entry<String,Integer>entry : hm.entrySet() ) {
sop(entry.getKey()+”;”+entry.getValue());
}
Collection<Integer> s1=hm.values();
Set<String> s2=hm.keySet();
Set<Map.Entry> s3=hm.entrySet();
------------------<ahref="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、
<ahref="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------