黑马程序员_泛型

---------------------- android培训java培训、期待与您交流! ----------------------

对泛型的理解:
没有使用泛型时,只要是对象,不管是什么类型的对象,都可以存储进同一个集合中。使用泛型集合,可以将一个集合中的元素限定为一个特定类型,集合中只能存储同一类型的对象,不仅安全,并且当从集合获取一个对象时,编译器也可以知道这个对象的类型,不需要对对象进行强制类型转换。泛型就是给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入  。编译生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据,例如,用反射得到集合,再调用其add方法即可,如下举例;
 import java.util.*;
public class GenericTest {
 public static void main(String[] args) throws Exception{
  ArrayList<Integer>  al=new ArrayList<Integer>();
  al.getClass().getMethod("add",Object.class).invoke(al,"avc");
  System.out.println(al);// 编译器只是在语法检查的时候提醒我们,但是运行的时候早就没有类型信息了 ,所有可以输出avc。
 }
}
 
泛型中的一些术语:
ArrayList<E>          泛型类型
E                     类型参数或者类型变量 因为这个变量不是普通的值而是指向变量
ArrayList<Integer>    参数化的类型
Integer               类型参数的实例或实际类型参数
ArrayList<Integer>    中的<>念typeof
ArrayList             称为原始类型
 
参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始数据类型的对象,编译报告警告:
Collection<String> c = new Vector();
原始类型可以引用一个参数化类型的对象,编译警告
Collection c = new Vector<String>();
 
参数化类型是不考虑类型参数的继承关系的:
Vector<String> v = new Vector<Object>(); //错误!不写<Object>没错
Vector<Object> v = new Vector<String>();//错误!
 
 
泛型中的?通配符:
 
ArrayList<Integer> collection3 = new ArrayList<Integer>();
printCollection(collection);
 // ? 可以指向任意类型
public static void printCollection(Collection<?> collection){
}
 
Vector<? extends Number> x = new Vector<Integer>();//向上限定,并包括自己
Vector<? super Integer> x = new Vector<Byte>();//向下限定,并包括自己
 
HashMap<String, Integer> maps = new HashMap<String, Integer>();
Maps.put(“flx”,22);
Maps.put(“zxx”,23);
Maps.put(“bxd”,20);
Set<Map.Entry<String, Integer>>  entrySet = maps.entrySet();
For(Map.Entry<String, Integer> entry:entrySet){
         System.out.println(entry.getKey() + “:” +entry.getValue());
}
创建泛型方法
private static <T> T add(T x,T y){
    return null;
}
private atatic <T> void swap(T[] a,int i,int j){
    T tmp = a[i];
    a[i] = a[j];
    a[j] = tmp;
}
但只有引用类型才可以作为泛型方法的实际参数。
也可以限定类型extends a&b。
多个类型参数<K,V>。
 
普通方法,构造方法 ,静态方法都可以使用泛型
编译器不允许创建类型变量的数组
    Vector<Integer> vectorList[] = new Vector<Integer>[10];错误
泛型中可以同时定义多个类型参数
    
 

 

---------------------- android培训java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值