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
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!