zoukankan      html  css  js  c++  java
  • 泛型(Generic)

    当集合中存储的对象类型不同时,那么会导致程序在运行的时候的转型异常

     1 import java.util.ArrayList;
     2 import java.util.Iterator;
     3 
     4 public class Demo5 {
     5     public static void main(String[] args) {
     6         ArrayList arr = new ArrayList();
     7         arr.add(new Tiger("华南虎"));
     8         arr.add(new Tiger("东北虎"));
     9         arr.add(new Sheep("喜羊羊"));
    10         System.out.println(arr);
    11         Iterator it = arr.iterator();
    12         while (it.hasNext()) {
    13             Object next = it.next();
    14             Tiger t = (Tiger) next;
    15             t.eat();
    16         }
    17 
    18     }
    19 }
    20 class Tiger {
    21     String name;
    22 
    23     public Tiger() {
    24 
    25     }
    26 
    27     public Tiger(String name) {
    28         this.name = name;
    29     }
    30 
    31     @Override
    32     public String toString() {
    33 
    34         return "Tiger@name:" + this.name;
    35     }
    36 
    37     public void eat() {
    38         System.out.println(this.name + "吃羊");
    39     }
    40 }
    41 
    42 class Sheep {
    43     String name;
    44 
    45     public Sheep() {
    46 
    47     }
    48 
    49     public Sheep(String name) {
    50         this.name = name;
    51     }
    52 
    53     @Override
    54     public String toString() {
    55         return "Sheep@name:" + this.name;
    56     }
    57 
    58     public void eat() {
    59         System.out.println(this.name + "吃青草");
    60     }
    View Code

    原因 :发现虽然集合可以存储任意对象,但是如果需要使用对象的特有方法,那么就需要类型转换,如果集合中存入的对象不同,可能引发类型转换异常.

    出现问题:

    存入的是特定的对象,取出的时候是Object对象,需要强制类型转换,可能诱发类型转换异常.

    无法控制存入的是什么类型的对象,取出对象的时候进行强转时可能诱发异常.而且在编译时期无法发现问题.

    虽然可以再类型转换的时候通过if语句进行类型检查(instanceof),但是效率较低.(例如吃饭的时候,还需要判断米饭里有没有沙子,吃饭效率低).可以通过给容器加限定的形式规定容器只能存储一种类型的对象.

    就像给容器贴标签说明该容器中只能存储什么样类型的对象。

    所以在jdk5.0后出现了泛型

    泛型应用:

    格式

    1. 集合类<类类型>  变量名  = new  集合类<类类型>();
     1 public class Demo5 {
     2     public static void main(String[] args) {
     3         // 使用泛型后,规定该集合只能放羊,老虎就进不来了.
     4         ArrayList<Sheep> arr = new ArrayList<Sheep>();
     5         arr.add(new Sheep("美羊羊"));
     6         arr.add(new Sheep("懒洋洋"));
     7         arr.add(new Sheep("喜羊羊"));
     8         // 编译失败
     9         // arr.add(new Tiger("东北虎"));
    10         System.out.println(arr);
    11         Iterator<Sheep> it = arr.iterator();
    12         while (it.hasNext()) {
    13             // 使用泛型后,不需要强制类型转换了
    14             Sheep next = it.next();
    15             next.eat();
    16         }
    17 
    18     }
    19 }
    View Code

    1. 将运行时的异常提前至编译时发生。

    2. 获取元素的时候无需强转类型,就避免了类型转换的异常问题

    格式  通过<> 来指定容器中元素的类型.

    什么时候使用泛型:当类中操作的引用数据类型不确定的时候,就可以使用泛型类.

    细节一

    声明好泛型类型之后,集合中只能存放特定类型元素

     1 public class Demo6 {
     2     public static void main(String[] args) {
     3         //创建一个存储字符串的list
     4         ArrayList<String> arr=new ArrayList<String>();
     5         arr.add("gz");
     6         arr.add("itcast");
     7         //存储非字符串编译报错.
     8         arr.add(1);
     9     }
    10 }
    View Code

    细节二:

    泛型类型必须是引用类型

     1 public class Demo6 {
     2     public static void main(String[] args) {
     3         // 泛型类型必须是引用类型,也就是说集合不能存储基本数据类型
     4         // ArrayList<int> arr2=new ArrayList<int>();
     5 
     6         // 使用基本数据类型的包装类
     7         ArrayList<Integer> arr2 = new ArrayList<Integer>();
     8         
     9         
    10     }
    11 }
    View Code

    细节三: 使用泛型后取出元素不需要类型转换.

     1 public class Demo6 {
     2     public static void main(String[] args) {
     3 
     4         ArrayList<String> arr = new ArrayList<String>();
     5         arr.add("gzitcast");
     6         arr.add("cditcast");
     7         arr.add("bjitcast");
     8         //使用泛型后取出元素不需要类型转换.
     9         String str=arr.get(0);
    10         System.out.println();
    11     }
    12 }
    View Code

     (见就业班回顾)

  • 相关阅读:
    前端杂七杂八
    用户数据分析
    hash表
    django杂七杂八
    redis事务
    CF1457D XOR-gun
    后缀数组学习笔记
    CF1439C Greedy Shopping
    P3320 [SDOI2015]寻宝游戏
    P5327 [ZJOI2019]语言
  • 原文地址:https://www.cnblogs.com/Michael2397/p/5968343.html
Copyright © 2011-2022 走看看