一、泛型
1、泛型:所谓泛型就是在定义类,定义接口时,通过一个标识表示类中的某个属性的类型。或者是某个方法的返回值及参数类型。这个参数在使用时(如:继承或者实现接口时,用这个类型申明的变量,创建对象时)确定(即传入实际类型参数,也称为类型实参)
2、优势:保证元素存储的安全问题;解决获取元素类型的强制类型转换问题
3、Map<String,DivObject> map = new HashMap();//指定key只能时String,Value也只能是指定的类型
4、如果接口定义泛型类型,实现接口时必须要指定泛型类型
5、泛型的核心思想:把一个集合中的内容限定为一个特定的数据类型
二、自定义泛型的结构
Interace List<T>或者class Test<K,V>,其中K、V、T不代表具体的值,只代表类型(不能使用八种基本类型,只能用其包装类,因为泛型必须时Object的子类),在实例化的时候要明确指定类型。其中泛型只能是类
泛型的实例化:一定要在类名或者接口名指定类型参数 :List<Integer> list = new ArrayList<Integer>(),最后一个Integer可以不写,若不写,则底层会进行类型推断
1、自定义泛型类
public Class DivClass<T,K,V>{
private T element;
public T setElement(T element){
this.element = element;
}
}
2、自定义泛型接口
public interface DivInterFace<T,K,V>{
V setName(V name);
}
3、自定义泛型方法 //泛型方法和类没有关系
public <T> T[] getArray(T[] arr){
return arr;
}
·子类不保留父类的泛型。
Class Son<E,V> extends Father<E>{};Class Son extends Father<Integer>{};
如果子类没有类型,则擦除
若要保留(1)子类在继承的时候指定父类的泛型
(2)子类需要再次申明父类泛型的类型(全部保留或者部分保留)
·静态方法不能使用泛型
·异常类不能使用泛型
三、通配符
1、通配符:?
比如List<?>,Map<?,?>
读取List<?>也是安全的,不管List的真实类型是什么,其都包含Object。
写入的时候不知道具体的元素对象类型,所以不能添加对象。唯一的例外是null
2、如果需要使用通配符
(1)不能在泛型、方法、以及返回值前使用,不能在类泛型类的声明上使用,创建对象时构造方法后不能使用通配符
(2)若要使用通配符时,要
限定通配符的上限(需要extends关键字),如:List<? extends Father>表示所使用的类型不能大于Father类(是Father类或者Father的子类)
限定通配符的下限,如List<? super Son> 表示所使用的类型不能小于Son类(是Son类或者Son的父类).
(3)super在求无穷大(只有下界) extends在求无穷小(只有上界)
(4)父类引用可以指向子类,所以super中直到了最小范围,故可以同父类指向
四、八种数据类型的包装类
1、int:Integer
2、byte:Byte
3、short:Short
4、char:Character //char类型是无符号的,所以不能为负(从0开始)
5、long:Long
6、float:Float
7、double:Double
8、boolean:Boolean