Java中的泛型
时间:2021-07-19 16:42:15
收藏:0
阅读:0
一、什么是泛型?
泛型是一种未知的数据类型,当我们不知道要使用什么数据类型的时候,可以使用泛型。
泛型也可以看成是一个变量,用来接收数据类型
E e:Element 元素
T t:type 类型
如:
1 public class ArrayList<E>{ 2 public boolean add<E e>{} 3 public E get(int num){} 4 }
ArrayList 集合在定义的时候,不知道集合中会存储什么类型的数据,所以类型使用了泛型,E 代表未知的数据类型
创建集合对象的时候,就会确定泛型的数据类型
ArrayList<String> list=new ArrayList<String>();
会把数据类型作为参数传递,把String 复制给泛型E
1 public class ArrayList<String>{ 2 public boolean add<String e>{} 3 public String get(int num){} 4 }
二、使用泛型的好处与弊端:
1.创建集合对象,不使用泛型时:
⑴好处:集合不使用泛型,也不指定数据类型时,默认的类型就是Object 类型,可以存储任意类型的数据
⑵弊端:不安全,会引发异常
如:
1 ArrayList list1=new ArrayList(); 2 list1.add("aaa"); 3 list1.add(11); 4 Iterator it=list1.iterator(); 5 while(it.hasNext){ //这里使用了迭代器,下面会讲迭代器 6 Object obj=it.next();System.out.println(obj); //可以,下面就不可以了。 7 8 //想要使用String类特有的方法比如length获取字符串的长度,就不能使用多态 Object obj="abc";需要向下转型,否则运行会报错 9 Stirng str=(String)it.next(); 10 System.out.println(str.length); 11 }
2.创建集合对象,使用泛型时:
⑴好处:①避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
②把运行期异常(代码运行期间才会抛出的异常),提升到了编译器(编译代码时就会报错)
⑵弊端:泛型是什么类型,就只能存储什么类型的数据。
如:
1 ArrayList<String> list2=new ArrayList<>(); 2 list2.add(1); //报错:add.(java.lang.String) in ArrayList cannot be applied to (int)
三、定义和使用含有泛型的类
定义一个含有泛型的类,模拟ArrayList集合
public class ArrayList<E e>{}
这里创建了类,但是不知道创建这个类的对象的时候会使用什么类型的数据,所以这里使用了泛型。泛型可以接收任意类型的数据
创建对象的时候再确定泛型的数据类型
ArrayList<Integer> list =new ArrayList<Integer>();
这里就把数据类型Integer 赋值给了 E
四、定义和使用含有泛型的方法:
定义含有泛型的方法:泛型定义在方法的修饰符和返回值类型之间。
格式:
修饰符 <泛型> 返回值类型 方法名(参数列表(使用泛型)){
//方法体
}
使用含有泛型的方法,在调用的时候再确定泛型的数据类型,传递的是什么类型的参数,泛型就是什么类型的数据
如:
public <M> void method(M m){//方法体}
五、定义和使用含有泛型的接口:
1.第一种使用方式:定义接口的实现类,实现接口,指定接口的泛型
1 public interface Iterator<E>{E next();} 2 //Scanner 类实现了Iterator接口,并指定接口的泛型为String,所以重写的next方法泛型默认就是String 3 public final class Scanner implements Iterator<String>{ 4 @Override 5 public String next(){//重写的方法体} 6 }
2.第二种使用方式:接口使用什么泛型,实现类就使用什么泛型,类跟着接口走
相当于定于了一个含有泛型的类,创建对象的时候确定泛型的类型
1 public interface List<E>{ 2 boolean add(E e); 3 E get(int index); 4 }
1 public class ArrayList<E> implements List<E>{ 2 public boolean add(E e){} 3 public E get(int index){} 4 }
六 泛型通配符
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以用通配符<?>表示。
但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
1.通配符基本使用:? 代表任意的数据类型,不能创建对象使用,只能作为方法的参数使用
只能接收数据,不能往该集合中储存数据
注意:泛型没有继承关系
2.泛型的上限限定和下线限定
泛型的上限限定:? extends E 代表使用的泛型只能是E类型的子类/本身
泛型的下限限定:? super E 代表使用的泛型只能是E类型的父类/本身
评论(0)