泛型是JDK1.5以后才有的, 可以在编译时期进行类型检查,且可以避免频繁类型转化!
一丶泛型类 / 泛型接口 / 泛型方法
泛型类:
class 类名<声明自定义泛型>{
}
class 类名<声明自定义泛型>{
}
1,该泛型 作用域为类
2,具体数据类型是在使用该类的时候创建对象时候确定的,如果创建对象是没有确定类型,则为Object类型
3,在类上自定泛型,不能作用在静态的方法中,如果静态方法要使用,则要在方法上自己声明
4,在泛型中不能使用基本数据类型。如果使用基本数据类型,那么就使用基本数据类型对应的包装类型。
泛型接口:
public interface IBaseDao<T>{
void save(T t );
void update(T t );
}
接口上自定义的泛型的具体数据类型是在实现一个接口的时候指定的。
public interface IBaseDao<T>{
void save(T t );
void update(T t );
}
如果我实现一个接口的时候,我目前不知道要操作的数据类型,要在创建接口实现类 对象的时候我才能指定泛型的具体数据类型。
如果要延长接口自定义泛型 的具体数据类型,格式如下:
public class Demo<T> implements IBaseDao<T>{
}
泛型方法:
public <K,T>T save(T t, K k) {
return null;
}
使用泛型方法: 在使用泛型方法的时候,确定泛型类型
当方法所属的类中也存在泛型,并且与方法泛型重名,则在方法中以方法的泛型为准
泛型关键字:
? 指定只是接收值
?关键字:
public void save(List<?> list) {
// 只能获取、迭代list; 不能编辑list
}
List<?> list = new ArrayList<String>();
//list.add("");// 报错
在Java中对于参数值是未知类型
的容器类,只能
读取其中元素,不能
向其中修改,添加,删除元素, 因为,其类型是未知,所以编译器无法识别添加元素的类型和容器的类型是否兼容,唯一的例外是NULL。
extends 元素的类型必须继承自指定的类 【上限】
super 元素的类型必须是指定的类的父类 【下限】
什么是上下限?? super Integer : 只能存储Integer或者是Integer父类元素。 泛型 的下限
? extends lang: 只能存储lang或者是lang类型的子类数据。 泛型上限
//泛型的上限
public static void getData(List<? extends lang> c){
//<span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">限定元素范围:元素的类型要继承自</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">lang</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">类</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);"> 【</span><span style="line-height: 28.7999992370605px; color: rgb(63, 95, 191); font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif;">上限</span><span style="line-height: 28.7999992370605px; color: rgb(63, 95, 191); font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif;">】</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">
</span>
}
//泛型的下限
public static void set(List<? super Integer> c){
//<span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">super</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">限定元素范围:必须是</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">Integer的父</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">类</span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);"> </span><span style="font-family: 'Lantinghei SC', 'Open Sans', Arial, 'Hiragino Sans GB', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', SimSun, sans-serif; line-height: 28.7999992370605px; color: rgb(63, 95, 191);">【下限】</span>
}
泛型写法:
<span style="white-space:pre"> </span>ArrayList<String> list = new ArrayList<String>(); //true
ArrayList<Object> list = new ArrayList<String>(); //false
ArrayList<String> list = new ArrayList<Object>(); //false
//兼顾新老系统的兼用性
<span style="white-space:pre"> </span>ArrayList<String> list = new ArrayList(); //true
<span style="white-space:pre"> </span>ArrayList list = new ArrayList<String>(); //true
二丶泛型擦除
泛型只在编译时期有效,编译后的字节码文件中不存在有泛型信息!
public static void main(String[] args) {
ArrayList<String> string = new ArrayList<String>();
string.add("adb");
ArrayList<Integer> integer = new ArrayList<Integer>();
integer.add(123);
System.out.println(string.getClass() == integer.getClass());
}
我们定义了两个ArraryList 一个为String 类型,只能存储字符串。另一个为Integer只能存放整形;
输出的结果为true 说明说明泛型类型String和Integer都被擦除掉了,只剩下了原始类型。