泛型
什么是泛型:
泛型就相当于标签
形式:<>
jdk1.5之后,用泛型来解决元素类型不确定的数据保存操作,
例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。
没有泛型的集合
public static void main(String[] args) { ArrayList al = new ArrayList(); al.add(98); al.add(18); al.add(38); al.add(88); al.add("丽丽"); for (Object o : al) { System.out.print(o+" "); } }
如果不使用泛型的话,有缺点:
一般我们在使用的时候基本上往集合里随意放值,因为底层是一个obj类型的数组,所以什么都能放,不方便管理。
在jdk1.5以后开始,使用泛型加入泛型的优点:在编译的时候就会对类型进行检查,不是泛型的就无法添加到这个集合
public static void main(String[] args) { ArrayList<Integer> al = new ArrayList(); al.add(98); al.add(18); al.add(38); al.add(88); for (Integer o : al) { System.out.print(o+" "); } }
总结:
JDK1.5之后
泛型实际就是一个<>引起来的参数类型,这个参数类型具体在使用的时候才会确定类型
使用了泛型后,可以确定集合的类型,在编译的时候就可以检查出来
使用泛型可能觉得麻烦,实际上使用泛型才会简单,后续的便利操作会简单许多
泛型对应的类型都是引用类型不能是基本类型
泛型类和泛型接口
声明泛型类时传入类型实参
创建泛型类对象时,传入类型实参
类型实参为空时,默认为Object类型
继承泛型类:
1.泛型父类不传入类型实参,默认为Object类型
2.泛型父类传入类型实参,子类既可以是泛型类,也可以不是
3.泛型父类传入类型实参,则子类必须是泛型类,且子类的类型形参列表必须包含父类的类型形参列表
泛型类的定义和实例化,如果实例化的时候不明确指定泛型,那么默认为Object类型
package TestGeneric.GenericTest; public class test01<e> { /* * 这是一个普通类 * test01<a>就是一个泛型类 * <>里面就是一个参数类型,但是这个类型是什么?,不确定,相当于一个占位 * 但是现在确定的是这个类型一定是引用类型,而不是基本类型 * */ int age; String name; e sex; public void a(e n){ } public void b(e[] n){ } static class Test{ public static void main(String[] args) { test01 gt1 = new test01(); gt1.a("abc"); gt1.a(17); gt1.a(9.8); gt1.b(new String[]{"a","b","A"}); test01<String> gt2 = new test01<>(); gt2.sex ="男"; gt2.a("abc"); gt2.b(new String[]{"a","b","A"}); } } }
继承:父类指定泛型接口
当父类指定了泛型类型,子类就不许要再指定了,可以直接使用
static class SubGeneric extends test01<Integer>{ } static class Demo{ public static void main(String[] args) { SubGeneric sgt = new SubGeneric(); sgt.a(19); } }
继承:父类不指定
如果父类不指定泛型,那么子类在实例化的时候需要指定
static class SubGeneric2<e> extends test01<e>{ }
泛型类可以定义多个参数类型
泛型类的构造器写法:
不同泛型的引用类型不可以互相赋值
泛型如果不指定,就会被擦除,例子就是
泛型类中的静态方法不能使用类的泛型
不能直接使用泛型数组的创建,如果非要创建