交换数组中的两个元素的位置的泛型方法语法定义如下:
0 u! r; j5 x! D0 {7 j* Y/ L) V# A 1 Y. w' q+ U+ B7 _! f2 R
static void swap(E[] a, int i, int j) {
4 x' f. A* H% s7 l : I* M4 N/ e% Z6 w
E t = a;
q. n- k6 Z+ Q6 |* s
8 t8 V4 p2 E4 B8 v a = a[j];
6 B! j; k9 o+ N
! U/ L) Q3 o' _: V( [, x3 Z( d a[j] = t;& ^% u8 S z* W/ V/ z
7 x1 j, h7 S' v& G! g' j) Z }//或用一个面试题讲:把一个数组中的元素的顺序颠倒一下
D, I+ q0 b$ H- H1 D1 L2 h8 q' n1 e7 q( d
1 V' x: o. A. D" _! B% C 只有引用类型才能作为泛型方法的实际参数,swap(new int[3],3,5);语句会报告编译错误。6 Y6 Q* `" L& T9 d* g$ J" ]6 o
; Q ~, l. d. W; a1 U, a 除了在应用泛型时可以使用extends限定符,在定义泛型时也可以使用extends限定符,例如,Class.getAnnotation()方法的定义。并且可以用&来指定多个边界,如 void method(){}
7 k+ Y1 |. W. Y, R0 @% w 0 |* i, w) Q* _7 \
l普通方法、构造方法和静态方法中都可以使用泛型。
1 [3 {7 \" y U" n3 r ) J# Z3 q. ?6 o5 g# r
l也可以用类型变量表示异常,称为参数化的异常,可以用于方法的throws列表中,但是不能用于catch子句中。
% C( [" o/ K) J+ j2 E( T" D
* P$ S+ E8 X4 M* N8 h) V l在泛型中可以同时有多个类型参数,在定义它们的尖括号中用逗号分,例如:public static V getValue(K key) { return map.get(key);}. C! V! |( r* \1 W, o
% G# m4 }) Y3 p Z! s, \% H# a# M5 x
类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader6 d1 e! Q0 O' ~; } R
- Y, d4 _- V! w+ H& _1 @1 | 类加载器也是Java类,因为其他是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器是java类,这正是BootStrap.9 E& r1 C) C& A# m; Q
, T# a$ I m5 {7 K lJava虚拟机中的所有类装载器采用具有父子关系的树形结构进行组织,在实例化每个类装载器对象时,需要为其指定一个父级类装载器对象或者默认采用系统类装载器为其父级类加载。 |