泛型

引入

泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型

Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException(强制转型异常)

参数化类型:把类型当作是参数一样传递

相关术语:

  • ArrayList<E>中的E称为类型参数变量
  • ArrayList<Integer>中的Integer称为实际类型参数

  • 整个称为ArrayList<E>泛型类型

  • 整个ArrayList<Integer>称为参数化的类型

泛型的作用

容器类中使用泛型

  • 避免继承着同一父类或借口的类的实例混杂在容器里面(多态)
  • 无需确定容器中储存对象的类型
  • 节省代码,功能相同但储存对象不同的容器类实现公用,功能由父类定义

方法中使用泛型

  • 节省代码,功能相同但传参和返回值不同的方法实现公用

接口中使用泛型

  • 将容器泛型和方法泛型整合
  • 任何一个实现该接口的类都要实现接口中定义的泛型方法
  • 而且方法的泛型随类实现时确定的泛型而变

泛型的使用格式(代码实现)

容器类中使用泛型

 1 public class TestGenerics {
 2     public static void main(String[] args){
 3         MyObject<Integer> mo=new MyObject();//实例化一个储存Integer对象的容器
 4         mo.set(34,0);
 5         //mo.set("abc",0);无法存入String对象
 6         System.out.println(mo.get(0).intValue()+6);//可以直接调用不需要再强转
 7         MyObject<String> no=new MyObject();//实例化一个储存String对象的容器,类似
 8         no.set("abc",0);
 9         System.out.println(no.get(0).charAt(1));
10     }
11 }
12 //定义一个泛型容器
13 class MyObject<E>{
14     //使用Object类型的数组来存储对象,所有类型的对象都可以储存
15     Object[] ob=new Object[10];
16     //设置加入元素的方法
17     public void set(E a,int index){
18         ob[index]=a;
19     }
20     //设置取出元素的方法
21     public E get(int index){
22         return (E)ob[index];//这里的强转使取出时不需查找类型再次强转
23     }
24 }

方法中使用泛型

 1 public class TestGenerics02 {
 2     public static void main(String[] args){
 3         show(123);
 4         show("erf");
 5     }
 6     //定义泛型方法
 7     public static <E>void show(E e){
 8         System.out.println(e);
 9     }
10 }

泛型实现接口

 1 public class TestGenerics03 {
 2     public static void main(String[] args){
 3         MyShow<String>[] str=new MyShow[3];
 4         str[0]=new MyString("afd");//只能存MyString
 5         str[1]=new MyString("afv");
 6         str[2]=new MyString("tds");
 7         MyShow<Integer>[] in=new MyShow[3];
 8         in[0]=new MyInteger(42);//只能存MyInteger
 9     }
10 }
11 interface MyShow<E>{
12     public abstract E show(E e);
13 }
14 class MyString implements MyShow<String>{
15     String st;
16     public MyString(String s){
17         this.st=s;
18     }
19     @Override
20     public String show(String s) {
21         return s;
22     }
23 }
24 class MyInteger implements MyShow<Integer>{
25     int in;
26     public MyInteger(int in){
27         this.in=in;
28     }
29     @Override
30     public Integer show(Integer integer) {
31         return integer;
32     }
33 }

也就两个优点结合在一起(反而不能当容器了。。。)

posted @ 2020-01-14 21:11  无恙hbc  阅读(104)  评论(0)    收藏  举报