泛型
来自瞎搞的枣儿
代码是我自己写的,如果道友发现错误望指出,谢谢~
1.泛型 可在编译时发现错误
2.软件的可靠性,和易读性
- Public static void max()
- 将泛型指定为另一类型的子类型 受限的
例如public static <E extends Object> void max()
3.泛型方法:or
- 不使用类型类型参数的泛型称为原始类型 例如ArrayLise
- 向后兼容ArrayList 向后兼容
public static <E extends Comparable<E>> void max()
4.原始类型的向后兼容
5.通配符
Tables | ||
---|---|---|
非受限通配符 | ? | 等同于?Extends Object |
受限通配符 | ? extends T | 表示T或T的未知子类型 |
下线通配符 | ? Super T | 表示T或T的未知父类型 |
6.消除泛型和对泛型的限制
- 泛型是利用类型消除实现的 —- 编译时使用泛型编译,编译成功后,编译器会将泛型向后兼容装换为原始类型。当翻译泛型类,泛型接口及泛型方法是会将泛型转换为Object;当泛型类型是不受限的,则将其转换为受限类型
- 泛型并不在JVM中单独成类,所以不能向上转换为基类
- 泛型使用限制:
1.不能使用new创建泛型实例;
2.不能直接使用new创建泛型数组,但可以利用 类似类型转化的方式(会有编译警告)
3.静态环境下不允许类的参数是泛型。
(由于泛型类的所有的实例都有相同的运行时类,所以泛 型类的静态变量和方法是被它的所有实例所共享。因此在静态方法、数据域或初始化语句中,未来类 而引用泛型类型参数是非法的)
4.异常类不能是泛型
demo
import java.util.ArrayList;
import java.util.Random;
/**
* Title 《Java语言程序设计》 19章课后第十八题
*
* Program 打乱ArrayList,编写以下方法:public static <E> void shuffle(ArrayList<E> list)
*
* @time 2017年9月24日 下午9:11:59
* @author xu
*
*/
public class P19_8 {
/**
* @param args
*/
//打乱
private static int n;
private static int size;
public static <E> void shuffle(ArrayList<E> list){
//Collections.shuffle(list)可以实现同样的功能;
size=list.size();
Random r=new Random(System.currentTimeMillis());
E ob=null;
for(int i=0;i<list.size();i++){
do{
n=r.nextInt(size);
}while(n==i);
ob=list.get(i);
list.set(i, list.get(n));
list.set(n, ob);
}
}
public static void main(String[] args){
Random r= new Random(System.currentTimeMillis());
ArrayList<Integer> ar=new ArrayList<>();
for(int i=0;i<20;i++){
ar.add(r.nextInt(999));
}
for(int e:ar){
System.out.print(e+" ");
}
System.out.println();
P19_8.shuffle(ar);
for(int e:ar){
System.out.print(e+" ");
}
}
}