Java高级编程——泛型(泛型类、泛型接口、泛型方法,完成详解,并附有案例 ...

打印 上一主题 下一主题

主题 779|帖子 779|积分 2337

泛型

21.1 概述

JDK5中引入的特性,在编译阶段束缚操作的数据范例,并举行检查
泛型格式:<数据范例>
泛型只能支持引用数据范例,假如写基本数据范例必要写对应的包装类。
泛型好处:


  • 统一数据范例
  • 把运行时期的问题提到了编译期间,避免了逼迫范例转换可能出现的异常,因为编译阶段范例就能确定下来。
泛型细节:


  • 泛型中不能写基本数据范例
    因为基本数据范例不能转成Object范例,包装类才华转成Object范例
  • 指定泛型后传递数据时,可以传入该类范例或者其子类范例
  • 假如不写泛型,范例默认是Object
21.2 泛型类

使用场景:当一个类中,某个变量的数据范例不确定时,可以定义带有泛型的类。
  1. 格式:
  2.   修饰符 class 类名<类型>{
  3.     ....
  4.   }
  5. 举例:
  6.   E可以理解为变量,但不是变量,不是记录数据的,是用来记录数据类型的
  7.   
  8.   public class ArrayList<E>{
  9.      //.....  当创建给类对象时,E就确定类型
  10.   }
复制代码
  1. //自定义泛型类
  2. public class MyArrayList<E>{
  3.     Object[] obj = new Object[5];
  4.     int size; // size:表示长度,即存了几个元素
  5.   
  6.     // E:表示不确定的类型
  7.     // e:形参的名字,变量名
  8.     // 添加元素
  9.     public boolean add(E e){
  10.         obj[size] = e;
  11.         size++;
  12.         return true;
  13.     }
  14.     // 获取元素
  15.     public E get(int index){
  16.         return (E) obj[index];
  17.     }
  18.     // 重写toString方法
  19.     @Override
  20.     public String toString() {
  21.         return Arrays.toString(obj);
  22.     }
  23. }
  24. ==================================================
  25.   public class Test {
  26.     public static void main(String[] args) {
  27.                                 //创建自己定义泛型类的对象
  28.         MyArrayList<String> list = new MyArrayList<>();
  29.         list.add("aaa");
  30.         list.add("bbb");
  31.         list.add("ccc");
  32.         System.out.println(list);
  33.         //[aaa, bbb, ccc, null, null]
  34.         String s = list.get(0);
  35.         System.out.println(s);//aaa
  36.         MyArrayList<Integer> list1 = new MyArrayList<>();
  37.         list1.add(1);
  38.         list1.add(2);
  39.         list1.add(3);
  40.         Integer integer = list1.get(1);
  41.         System.out.println(integer);//2
  42.     }
  43. }
复制代码
21.3 泛型方法

方法中形参范例不确定时:


  • 方案1:使用类名后定义的泛型(如21.2中的add方法)
    在本类里全部方法都可以用
  • 方案2:在方法申明上定义自己的泛型
    只有本方法能用
  1. 格式:
  2.   修饰符 <类型> 返回值类型 方法名(类型 变量名){
  3.   
  4. }
  5. 举例:
  6.   public <T> void show(T t){
  7.   // 调用该方法时,T才能确定类型
  8. }
复制代码
  1. public class ListUtil {
  2.     // 私有化构造方法,不让外界本类的对象
  3.     private ListUtil(){}
  4. // 类中定义静态方法addAll, 用来添加多个集合的元素
  5. //public static <E> void addAll(ArrayList<E> list,E e1,E e2){
  6.     //     list.add(e1);
  7.     //     list.add(e2);
  8.     // }
  9.   
  10.    //可变参数 E...e
  11.    public static <E> void addAll(ArrayList<E> list,E...e){
  12.         for (E element : e) {
  13.             list.add(element);
  14.         }
  15.     }
  16.   
  17.     public void show(){
  18.         System.out.println("这是自定义工具类....");
  19.     }
  20. }
  21. ==========================================
  22.   public class Test {
  23.     public static void main(String[] args) {
  24.         // 在创建对象时,就可以确定泛型方法的形参类型
  25.         ArrayList<String> list = new ArrayList<>();
  26.         ListUtil.addAll(list,"6","8");
  27.         System.out.println(list);//[6, 8]
  28.         ArrayList<Integer> list2 = new ArrayList<>();
  29.         ListUtil.addAll(list2,5,1);
  30.         System.out.println(list2);//[5, 1]
  31.     }
  32. }
复制代码
21.4 泛型接口

  1. 格式:
  2.   修饰符 interface 接口名<类型>{
  3.   
  4. }
  5. 举例:
  6.   public interface List<E>{
  7.   
  8. }
  9. 泛型接口的两种使用方式:
  10.      1.实现类给出具体的类型
  11.      2.实现类延续泛型,创建实现类对象时再确定类型
复制代码
  1. // 1.实现类给出具体的类型,实现List接口
  2. public class MyArrayList2 implements List<String> {
  3.   // 省略重写List里的抽象方法
  4. }
  5. ==================================================
  6.   public class Test {
  7.     public static void main(String[] args) {
  8.        //MyArrayList集合中只能存字符串,
  9.        //创建MyArrayList对象时不用指定泛型
  10.         MyArrayList list = new MyArrayList();
  11.         list.add("666");
  12.     }
  13. }
复制代码
  1. // 2.实现类延续泛型,创建实现类对象时再确定类型
  2. public class MyArrayList02<E> implements List<E> {
  3.   // 省略重写List里的抽象方法
  4. }
  5. ==================================================
  6.   public class Test02 {
  7.     public static void main(String[] args) {
  8.         // 2.实现类延续泛型,创建实现类对象时再确定类型
  9.         MyArrayList02<Integer> list = new MyArrayList02<>();
  10.         list.add(6);
  11.     }
  12. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表