首页 > 其他 > 详细

泛型的定义和使用

时间:2020-04-17 22:24:30      阅读:62      评论:0      收藏:0      [点我收藏+]

泛型的概念

泛型是一种数据类型,当我们不知道使用什么数据类型是,可以使用泛型。 泛型也可以看出一个变量,用来接收数据类型。

 
    E e :Element 元素
 ?
    T t :Type 类型

 

如:

ArrayList集合在定义的时候,不知道集合都会存储什么类型的数据,所以使用泛型:

E :未知的数据类型

什么时候确定泛型的数据类型呢?

答:创建集合对象的时候,就会确定泛型的数据类型

 ArrayList<String> list = new Arraylist<>();
 

 public class ArrayList<E>{
     public boolean add(E e){}
     public E get(int index){}
 }

//创建集合对象的时候,就会确定泛型的数据类型
public class Arraylist<String>{
     public boolean add(String s){}
     public String get(int index){}
 } 
 ?

 

 

泛型的定义与使用

我们在集合中会大量使用到泛型,这里来完整地学习泛型知识。

  • 泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。

  • 将数据类型作为参数进行传递。

定义和使用含有泛型的类

定义语法格式:

 修饰符 class 类名<代表泛型的变量> { //方法体 }

例如,API中的ArrayList集合:

 class ArrayList<E>{ 
     public boolean add(E e){ }
 ?
     public E get(int index){ }
     ....
 }

 

使用泛型: 即什么时候确定泛型。

在创建对象的时候确定泛型

例如,

ArrayList<String> list = new ArrayList<String>();

 

此时,变量E的值就是String类型,那么我们的类型就可以理解为:

 class ArrayList<String>{ 
      public boolean add(String e){ }
 ?
      public String get(int index){  }
      ...
 }

 

泛型通配符

当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

通配符基本使用

泛型的通配符:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。

此时只能接受数据,不能往该集合中存储数据。

通配符高级使用----受限泛型

之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限下限

泛型的上限

  • 格式类型名称 <? extends 类 > 对象名称

  • 意义只能接收该类型及其子类

泛型的下限

  • 格式类型名称 <? super 类 > 对象名称

  • 意义只能接收该类型及其父类型

比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类

 public class DemoGeneric {
     public static void main(String[] args) {
         Collection<Integer> list1 = new ArrayList<Integer>();
         Collection<String> list2 = new ArrayList<String>();
         Collection<Number> list3 = new ArrayList<Number>();
         Collection<Object> list4 = new ArrayList<Object>();
 ?
         getElement1(list1);
 //        getElement1(list2);//报错 String类与Number类没有继承关系,因此泛型没有受限一说
         getElement1(list3);
 //        getElement1(list4);//报错 Object类是Number类的父类,因此不能使用泛型上限
 ?
 //        getElement2(list1);//报错
 //        getElement2(list2);//报错
         getElement2(list3);
         getElement2(list4);
 ?
         /*
             类与类之间的继承关系:
             Integer extends Number extends Object
             String extends Object
          */
 ?
     }
 ?
     // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
     public static void getElement1(Collection<? extends Number> coll) {
     }
 ?
     // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
     public static void getElement2(Collection<? super Number> coll) {
     }
 }

 

泛型总结

1、泛型类和泛型方法

定义语法格式:

权限修饰符 class 类名<泛型>{}

权限修饰符 返回值类型 方法名(泛型作为参数传递){}

2、泛型接口和泛型方法

定义语法格式:

接口:权限修饰符 interface 接口名称<泛型>{}

实现类: 权限修饰符 class 类名<泛型> implement 接口名<泛型>{}

权限修饰符 返回值类型 方法名(泛型作为参数传递){}

3、泛型通配符

package _4泛型的概念和使用._4泛型的高级使用$泛型的受限$上限_下限;
 ?
 import java.util.ArrayList;
 import java.util.Collection;
 ?
 /**
  * @Author Admin
  * @Classname DemoGeneric
  * @Package _4泛型的概念和使用._4泛型的高级使用$泛型的受限$上限_下限
  * @GreatDate 2020/04/17 21:56:07
  * @Description TODO 泛型的高级使用,泛型的受限(上、下限限定)
  */
 /*
     泛型的受限
     上限限定:? extends E;代表使用的泛型只能是E类型的子类/本身
     下限限定:? super E:  代表使用的泛型只能是E类型的父类/本身
  */
 public class DemoGeneric {
     public static void main(String[] args) {
         Collection<Integer> list1 = new ArrayList<Integer>();
         Collection<String> list2 = new ArrayList<String>();
         Collection<Number> list3 = new ArrayList<Number>();
         Collection<Object> list4 = new ArrayList<Object>();
     
         getElement1(list1);
         //getElement1(list2);//报错
         getElement1(list3);
         //getElement1(list4);//报错
     
         //getElement2(list1);//报错
         //getElement2(list2);//报错
         getElement2(list3);
         getElement2(list4);
     }
     /*
         类生类之间的继承关系
         Integer extends Number extends Object
         String extends 0bject
      */
     // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
     public static void getElement1(Collection<? extends Number> coll){}
     // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
     public static void getElement2(Collection<? super Number> coll){}
 }
 ?
 

 

泛型的定义和使用

原文:https://www.cnblogs.com/elvin-j-x/p/12722808.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!