> 文档中心 > 《Java 核心技术 卷1》 笔记 第12章 泛型程序设计(1) 泛型类设计初步

《Java 核心技术 卷1》 笔记 第12章 泛型程序设计(1) 泛型类设计初步


 

 12.1 为什么要使用泛型程序设计

JDK 5 之前的泛型程序设计特征:使用继承实现

因为 Object 是所有类的公共父类,所以 ArrayList 类只需要维护 Object 数组:

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

public class ArrayList{    private Object[] elementData;    public Object get(int i){}    public void add(Object o){}}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

不使用泛型,有两个问题:

  1. 必须进行强制类型转换
  2. 添加错误类型时,没有检查

针对这两个问题,我们自定义一个 MyArrayList 测试一下:

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

public class Main {    public static void main(String[] args) { MyArrayList list = new MyArrayList(); for(int i = 0; i < 15; i++){     list.add(i); } System.out.println(list); //1. 必须强制转换 int v = (int) list.get(5); //2. 没有类型错误检查,放错了不知道(注意,编译器可能在强制转换前都不会报错) list.add("123"); System.out.println(list.get(15)); int t = (int) list.get(15);    }  } class MyArrayList{    Object[] arr;    int size;    int len = 0;    public MyArrayList(){ size = 10; arr = new Object[size];    }     public void add(Object obj){ if(len == size){     size = size*2;     Object[] copy = new Object[size];     System.arraycopy(arr,0,copy,0,arr.length);     arr = copy; }  arr[len++]=obj;    }     public Object get(int index){ if(index= len)     throw new IndexOutOfBoundsException(outOfBoundsMsg(index));  return arr[index];    }     private String outOfBoundsMsg(int index) { return "Index: "+index+", Size: "+size;    }     @Override    public String toString() { if(len == 0) return ""; StringBuilder sb = new StringBuilder("["); for(int i = 0; i < len; i++){     sb.append(arr[i]);     sb.append(","); } sb.deleteCharAt(sb.length()-1); sb.append("]"); return sb.toString();    }}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

针对这个没有错误检查的问题,泛型应运而生了,它的作用是辅助编译器(程序员)检查集合存储的类型是否与给定类型一致

Jdk 1.7 开始,泛型右侧中的类型可省略:

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

List list = new ArrayList();

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

 12.2 简单泛型类的定义

以 javafx.util.Pair 为例,泛型类大概分为 4 个部分:

  1. 类型后面定义泛型 class XX<指代符号1,指代符号2>{}
  2. 变量类型定义泛型 private 指代符号 变量名; 注意此处的 指代符号,需要和1中定义的 指代符号 之一相同,如截图中 pirvate K key; 与 1 中的 指代符号1相同
  3. 返回值定义泛型, public 指代符号 方法名(){} , 需要和 1 中的 指代符号之一相同(如果不同需要加 <指代符号>,以下为不同的情况)

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

public  V getItem(V v){ return v;}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

  4. 参数为泛型,同 3 如果类型中没有指明泛型类型,则需要使用 在方法前说明

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

import javafx.util.Pair; public class PairTest1 {    public static void main(String[] args) { String[] words = new String[]{"Mary","had","a","little","lamb"}; Pair mm = ArrayAlg.minmax(words); System.out.println("min = "+mm.getKey()); System.out.println("max = "+mm.getValue());    } } class ArrayAlg{    public static Pair minmax(String[] a){ if(a == null || a.length == 0) return null; String min = a[0]; String max = a[0]; for(int i = 1; i 0) min = a[i];     if(max.compareTo(a[i])<0) max = a[i]; }  return new Pair(min,max);    }}

❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤❤🧡💛💚💙💜🤎🖤

结果:

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

🚗🚓🚕🛺🚙🚌🚐🚎🚑🚒🚚🚛🚜🚘🚔🚖🚍🦽🦼🛹🚲🛴🛵🏍

相关内容:选择 《Java核心技术 卷1》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

如果对作者发布的内容感兴趣,可点击下方关注公众号 钰娘娘知识汇总 查看更多作者文章哦!