泛型

一、泛型

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

posted @ 2019-07-26 08:53  JQbiu  阅读(278)  评论(0编辑  收藏  举报