Java基礎 —— 泛型

走进舒适圈發表於2024-12-08

泛型

 泛型提供了編譯時型別安全檢測機制,該機制允許程式設計師在編譯時檢測到非法的型別。

理解

 為了可以進一步理解泛型,我們先來看一個問題

需求:
 編寫一個程式,在ArrayList中新增三個物件,類中要有name、age屬性,輸出物件的name、age屬性

  • 首先,我們先用傳統方法進行編寫
package com.sxny;

import java.util.ArrayList;

public class text {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList();
        arrayList.add(new Person("王五",55));
        arrayList.add(new Person("李四",12));
        arrayList.add(new Person("王五",8));
        arrayList.add(new Animal("奶蓋",2));
        for (Object o:arrayList){ //增強for迴圈
            Person person = (Person)o;
            System.out.println(person);
        }
    }
}
class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Animal{
    private String name;
    private int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

​​ 從上圖我們可以看到,用傳統方法,會出現ClassCastException異常, 其原因主要是傳統方法中,需要進行型別的轉換。Person在進入Arraylist中時會轉換成Object型別,在取出時又會轉回Person型別。

  • 針對以上問題,現在我們利用泛型來解決
package com.sxny;

import java.util.ArrayList;

public class text {
    public static void main(String[] args) {
        ArrayList<Person> arrayList = new ArrayList<Person>();
        arrayList.add(new Person("王五",55));
        arrayList.add(new Person("李四",12));
        arrayList.add(new Person("王五",8));
        // arrayList.add(new Animal("奶蓋",2));
        for (Object o:arrayList){ //增強for迴圈
            Person person = (Person)o;
            System.out.println(person);
        }
    }
}
class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
class Animal{
    private String name;
    private int age;
    public Animal(String name,int age){
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Animal{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 在建立Arraylist時限制了新增元素的型別, Arraylist arraylist = new Arraylist()若發現型別不符合,則會報錯,並且在遍歷時無需型別的轉換,因此,解決了ClassCastException異常的問題。

使用泛型的好處

  • 編譯時,檢查新增的元素,增加了安全性。
  • 無需資料型別的轉換,提高了效率。
  • 不再提示警告。

類萬用字元

 通常類萬用字元使用 ?代替具體的型別引數。例如,List<?>邏輯上是List<Integer>List<String>等所有List<型別>的父類。

相關文章