黑马程序员--进阶篇:泛型

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

1.泛型(generic):泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源
程序中的非法输入,编译器编译带类型说明的集合时会除掉“类型”信息,使程序运行效率不
受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样,由于编译
生成的字节码会去除掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其
它类型的数据。


2.关于泛型的基本术语:
1.“ArrayList<E>”整个称为泛型类型;
2.“ArrayList<E>”中的“E”称为类型变量或类型参数;
3.“ArrayList<Integer>”称为参数化的类型;
4.“ArrayList<Integer>”中的“Integer”称为类型参数的实例或实际类型参数;
5.“ArrayList<E>”中的“<>”年typeof;
6.“ArrayList”称为原始类型;


3.泛型中数据类型不考虑父子关系;


4.通配符:通配符是一种特殊语句,主要有星号(*)和问好(?),用来模糊搜索文件,当查找文件
夹式,可以使用它来代替一个或多个真正字符,当不知道真正字符或者懒得输入完整名字时,
常常使用通配符来代替一个或多个真正的字符。


5.通配符的扩展:
1.限定通配符的上边界: Vector<? extends Number> x = new Vector<Integer>();
2.限定通配符的下边界: Verctor<? super Integer> x = new Vector<Number>();


6.示例代码:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
map1.put("zsd", 55);
map1.put("df", 49);

Set<Entry<String, Integer>> entrySet = map1.entrySet();
for(Map.Entry<String, Integer> entry : entrySet){
System.out.println(entry.getKey() + ":" + entry.getValue());




7.自定义泛型:
1.用于防止泛型的类型参数的尖括号应出现在方法的其他所有修饰符之后和在方法的返回类型
之前,也就是紧邻返回值之前,类型参数通常用单个字母大写表示。
2.只有引用类型才能作为泛型方法的实际参数, 
3.除了在应用反省是可以使用extends限制符,在定义泛型是也可以使用extends限定符
4.普通方法,构造方法和静态方法中都可以使用泛型,编译器也不允许创建类型变量的数组;
5.类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch
子剧中;
6.在泛型中可以同时又多个类型参数,在定义它们的尖括号中用逗号分


8.根据调用泛型方法时十几传递的参数类型或返回值的类型来判断:
1.当某个类型变量只在整个参数列表中的所有参数和返回值中的一处被应用可,那么根据调用方法
时该出的色实际应用类型来确定,,即直接根据调用方法时传递的参数类型或返回值来决定泛型
参数的类型,例如:swap(new String[3] 3,4)->static<E>void swap(E[]a, int i,int j)
2.当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用了,如果调用方法时这多处
时实际都对应同一种类型来确定,如:add(3,5)->static<T>T add(T a, T b);
3.当某个类型变量在整个参数列表中大的所有参数和返回值中的多处被应用,如果调用方法时这多处的
实际应用类型对应到不同的类型,且没有使用返回值,这时候取多个参数的最大交集类型
4.当某个类型变量在整个参数列表中的所有参数和返回值中的多处被应用可,如果调用方法是这多处的
十几应用类型对应到不同的类型,并且使用那个返回值中的多处被应用了,如果调用方法时这多处的实际
应用类型对应到了不同类型,并且使用返回值,这时候,这时候优先考返回值的类型、
5.参数类型的类型推断具有传递性,


9.泛型类型的注意事项:
1,在对泛型类型进行参数化时,类型参数的实例必须是引用类型,不能是基本类型。
2.当一个变量被声明为泛型时,只能被实例变量和方法调用(还有内嵌类型),而不能被静态变
量和静态方法调用,因为静态成员是被所有参数化的类所共享的,所以静态成员不应该有类级别的
参数。


10.示例代码:


Method applyMethod = GenericTest.class.getMethod("applyV", Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pty = (ParameterizedType)types[0];
System.out.println(pty.getRawType());
System.out.println(pty.getActualTypeArguments());
public static void applyV(Vector<Date> v1){

}


package zhang;
import java.util.*;
public interface GenericData<E> {

public void add(E x){

}

public E findById(int id ){
return null;

}

public void delete(E object){

}

public void delete(int id){

}

public void update(E object){

}

public Set<E> findByConstration(String where){
return null;
}
}


10.类加载器:类加载器的作用就是获取class里面的内容等;


11.java虚拟机的默认的三个主要类加载器,BootStrap(引导程序),ExtClassLoader(加载器),AppClassLoader(载器);


12.类加载器也是java类,因为其他事java类的类加载器本身也是被类加载器加载,显然必须有第一个类加
载器不是java类,是BootStrap。


13.类加载器的委托机制:
1.当java虚拟机加载一个类时:
(1)首先当前线程的类加载器去加载线程中的第一个类。
(2)如果类A中引用了类B,java虚拟机将使用加载了A的类装载器来加载类B。
(3)还可以直接调用ClassLoader.loadClass()方法来制定某个类加载器去
加载某个类。


14.类加载器的委托模式:每个ClassLoader本身只能分别加载特定位置和目录中的类,但他们可以委托其
它的类加载器去加载类


15.类加载器的委托模式:
第一步:类装载器一级级委托到BootStrap类加载器,
第二步:当BootStrap无法加载当前所要加载的类时,然后才一级级回退到子孙类装载器
去进行真正的加载,
第三步:当退回到最初的类装载器是,如果他自己也不能找到能完成类的装载时,那就会报告
ClassNotFoundException异常。


16.自定义的类加载器必须继承ClassLoader;

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值