java学习day5——集合进阶(泛型)
·
泛型
泛型的格式:<数据类型>,泛型只能支持引用数据类型,用于判断存入的数据是否符合类型条件。目的是统一集合中的数据类型。
没有泛型的时候,可以往一个集合里添加任意类型的元素。但是所有元素的类型都默认为为Object类型。并且此时获取出来的数据都认为是object类型,因此不能使用子类的特有功能,而用强转实现特有功能时又会很麻烦,容易导致类型转换异常。因此推出了泛型的使用。
java中的泛型是伪泛型,只是在存入是判断一下数据是否为对应类型,而存入时还是按照Object类型存储,获取其中内容时又给出对应的类型。
泛型类,泛型方法,泛型接口
泛型类
像arrayList就是一个泛型类,只有在输入这个E时,才会确定这个变量(看作一个变量)E的值,也就是确定数据类型(这个E,可以用任意值代替,就可以看作是一个变量)
public class ArrayList<E>{
}
此处尝试写了一个泛型类
import java.util.Arrays;
//这是一个泛型类,当编写代码时不确定类型时使用。
public class MyArrayList<E> {
Object[] obj = new Object[10];
int size;
//此处的E,表示不确定的数据类型
public boolean add(E e){
obj[size] = e;
size ++;
return true;
}
public E get(int index){
return (E)obj[index];
}
@Override
public String toString() {
return Arrays.toString(obj);
}
}
泛型方法
方法中形参类型不确定时,可以在整个类上定义泛型,也可以仅在方法上定义一个泛型。
import java.util.ArrayList;
public class ListUtils {
private ListUtils(){
}
public static <E> void addAll(ArrayList<E> list,E e1,E e2,E e3,E e4){
list.add(e1);
list.add(e2);
list.add(e3);
list.add(e4);
}
public static <E> void addAll2(ArrayList<E> list,E...e){
for (E e1 : e) {
list.add(e1);
}
}
}
泛型接口
泛型接口有两种实现方法:1.实现接口的类(实现类)中给出具体的类型2.实现类不给出具体类,等到创建对象时再确定类型。
泛型的继承和通配符
泛型不具备继承性,但是数据具备继承性。
当数据类型不确定,但是想限定一个方法以后只有一个继承体系里的类型可以使用时,就可以用泛型的通配符解决。
import java.util.ArrayList;
public class GenericsDemo3 {
public static void main(String[] args) {
ArrayList<Ye> list1 = new ArrayList<>();
ArrayList<Fu> list2 = new ArrayList<>();
ArrayList<Zi> list3 = new ArrayList<>();
//
method(list1);
//method(list2);
//method(list3);
//用method3就不会报错
method3(list1);
method3(list2);
method3(list3);
}
public static void method(ArrayList<Ye> list) {
}
//这样写方法也存在问题,此时任意的类型都可以使用这个方法
//但是我这个方法的实际目的是只能由Ye,Fu,Zi能够使用
//因此需要借助泛型的通配符来解决,也就是下面的方法
public static<E> void method2(ArrayList<E> list){
}
//? extends E 可以传递E及E的所有子类
//? super E 可以传递E及E的所有父类
public static void method3(ArrayList<? extends Ye> list){}
}
class Ye{
}
class Fu extends Ye{
}
class Zi extends Fu{
}
更多推荐




所有评论(0)