如果不使用泛型的话,有缺点:
一般我们在使用的时候基本上往集合中存入的都是相同类型的数据-->便于管理,所以现在什么引用数据类型都可以存入集合,不方便!
JDK1.5以后开始使用泛型,集合中使用泛型:
// 创建一个ArrayList集合 ,向这个集合存入学生的成绩:
// 加入反省的优点:在编译时期就会对类型进行检查,不是泛型对应的类型就不可以添加入这个集合
ArrayList<Integer> al =new ArrayList<>();
al.add(16);
al.add(27);
al.add(86);
al.add(99);
// 对集合遍历查看
/*for (Object obj : al){
System.out.println(obj);
}*/
for (Integer i:al){
System.out.println(i);
}
泛型总结:
1.JDK1.5以后
2.泛型实际就是一个<>引起来的参数类型,这个参数类型 具体在使用的时候才会确定具体的类型
3.使用了泛型以后,可以确定集合中存放数据的类型,在编译时期就可以检查出来
4.使用泛型你可能觉得麻烦,实际使用了泛型才会简单,后续的遍历等操作简单
5.泛型的类型:都是引用数据类型,不能是基本数据类型
泛型接口
泛型类的定义和实例化
/**
* GenericTest就是一个普通的类
* GenericTest<A>就是一个泛型类
* <>里面就是一个参数类型,但是这个类型是什么呢?这个类型现在是不确定的,相当于一个占位
* 但是现在确定的是这个类型一定是一个引用数据类型,而不是基本数据类型
*/
public class GenericTest<E> {
int age;
String name;
E sex;
public void a(E n){
}
public void b(E []m){
}
}
class Test{
public static void main(String[] args) {
// GenericTest 进行实例化
// 实例化的时候不指定泛型:如果实例化的时候不明确的指定类的泛型,那么认为此泛型为Object类型
GenericTest gt = new GenericTest();
gt.a("abc");
gt.a(16);
gt.a(9.8);
gt.b(new String[]{"a","b","c"});
// 实例化的时候指定泛型 -->推荐方式
GenericTest<String> gt1 = new GenericTest<>();
gt1.sex="男";
gt1.a("abc");
gt1.b(new String[]{"a","b","c"});
}
}
2.继承情况:
父类指定泛型:
class SubGenericTest extends GenericTest<Integer>{
}
class demo{
public static void main(String[] args) {
// 指定父类泛型 , 那么子类就不需要在指定泛型了,可以直接使用
SubGenericTest sgt = new SubGenericTest();
sgt.a(16);
sgt.b(new Integer[]{1,2,3,});
}
}
父类不指定泛型:
如果父类不指定泛型,那么子类也会变成一个泛型类,那这个E的类型可以在创建子类对象的时候确定
class SubGenericTest1<E> extends GenericTest<E>{
}
class demo{
public static void main(String[] args) {
SubGenericTest1<String> sgt = new SubGenericTest1<>();
sgt.a("abc");
sgt.sex="女";
}
}
应用场合: