首頁 >Java >java教程 >一起來理解Java中的泛型

一起來理解Java中的泛型

WBOY
WBOY轉載
2022-05-18 17:06:462161瀏覽

本篇文章為大家帶來了關於java的相關知識,其中主要介紹了關於泛型的相關問題,包括了自訂泛型類別、自訂泛型方法、自訂泛型介面等等內容,下面一起來看一下,希望對大家有幫助。

一起來理解Java中的泛型

推薦學習:《java影片教學

  • 泛型:是JDK5中引入的特性,可以在編譯階段約束操作的資料類型,並進行檢查。
  • 泛型的格式:<資料型別>,注意:泛型只能支援引用資料型別
  • 集合系統的全部介面和實作類別都是支援泛型的使用的。

優點:

  • 統一資料型態。
  • 把執行的問題提前到編譯期間,避免了強制型別轉換可能出現的問題,因為編譯階段型別便可以確定。
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("石原里美");
        list.add("工藤静香");
        list.add("朱茵");
        for (String s : list) {
            System.out.println(s);
        }
    }
输出结果:
石原里美
工藤静香
朱茵

且泛型還可以在很多地方進行定義,例如在類別後面就是泛型類別、方法宣告上就是泛型方法、介面後面就是泛型介面。接下來我們一起來學習這些泛型是如何使用的: 

自訂泛型類別

概念

  •  定義類的同時定義了泛型的類別就是泛型類別。
  • 泛型類別的格式:修飾符class 類別名稱<泛型變數> {        }
public class MyArrayList<E>{    }
  • #作用:編譯階段可以可以指定資料類型,類似集合的作用

實戰教學 

現創建一個泛型類,實現基本的增加、刪除操作,以此來具體了解其用法:

//泛型类MyArrayLIst
public class MyArrayLIst<E> {
    public void add(E e){

    }
    public void remove(E e){

    }
}
//main
public static void main(String[] args) {
        MyArrayLIst<String> list = new MyArrayLIst<>();
        //通过对泛型的设定,实现对数据专一处理
        list.add("石原里美");
        list.add("工藤静香");
        list.remove("工藤静香");
    }

 泛型類別的原理:

把出現泛型變數的地方全部替換成傳輸的真實的資料型別。

透過認真觀察,其實不難去發現,泛型類別與普通類別的最大區別在於在呼叫方法的時候可以統一的對同一種資料進行處理,不會涉及到其他的資料類型,從一定程度上避免了強制類型轉換時可能會出現的問題。

自訂泛型方法 

 概念

  •  定義方法的同時定義了泛型的方法是泛型方法。
  • 泛型方法的格式:修飾符<泛型變數> 傳回值型別方法名稱(形參考清單){        }
#
public <E> void view(E e){    }
  • #作用:方法中可以使用泛型接收一切實際類型的參數,方法更具備通用性。
  • 注意:泛型方法需要區別於泛型類別中所定義的方法,雖然它們也在使用泛型,但是該泛型不是其定義的,而是泛型類別定義的。

實戰教學 

無論傳入何種類型的數組,都可以返回它的內容,即實現Arrays.toString()的作用

public static void main(String[] args) {
        String [] name = {"石原里美","工藤静香","朱茵"};
        view(name);
        Integer [] age = {18,19,20};
        view(age);
    }
    public static  <T> void view(T[] arr){
        StringBuilder list = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            list.append(arr[i]).append("\t");
        }
        System.out.println(list);
    }

 透過實現對泛型方法的定義,可以實現多種資料類型的接收,應用範圍更加廣泛。

自訂泛型介面 

概念 

  • 使用泛型定義的介面就是泛型介面。
  • 泛型介面的格式:public interface People{        }
  • ##
public interface People <E>{    }
    作用:泛型介面可以讓實作類別選擇目前功能需要操作的資料型別
實戰教學 

定義一個People接口,實現對老師Teacher類別、學生Student等類別的操作

//People接口
public interface People <E>{
    void run(E e);
    void height(E e);
}
//Student类
public class Teacher {

}
//实现类Fantype
public class Fantype implements People<Teacher> {

    @Override
    public void run(Teacher teacher) {

    }

    @Override
    public void height(Teacher teacher) {

    }
}
透過對上述程式碼的觀察,可以發現,People後定義的是什麼類型,那麼實作類別只能對該種資料類型進行操作,其他類型不可以進行此操作。

通配符和上下限 

通配符 

  • ?可以在“使用泛型”的时候代表一切类型
  • E T K V是在定义泛型的时候用的 

 假设现在有一场为学生和老师而举办的比赛,需要比较速度究竟谁更快,分别创建一定数量的对象并将其传入集合之中。然而当我们将这两个集合分别传入方法中的时候,会发现,学生对象集合list2出现报错,为什么呢?原因是因为数据类型不同,那么该如何使得两种类型都可以传入呢?或许这个时候就会有人说了:“既然两个类都是People的子类,那么为什么不定义它的泛型是People呢?”这个想法很好,但是我们需要明确一点的是子类与父类虽然是有关系的,但是定义之后的集合是没有关系的,所以这里是行不通的。

//main
//老师对象集合
ArrayList<Teacher> list1 = new ArrayList<>();
list1.add(new Teacher());
list1.add(new Teacher());
pk(list1);
//学生对象集合
ArrayList<Student> list2 = new ArrayList<>();
list2.add(new student());
list2.add(new student());
pk(list2);//由于pk方法的形参是泛型为Teacher的集合,所以会报错
//父类
class People{

    }
//子类
class Teacher extends People{

    }
class student extends People{

    }
//pk方法:
public static void pk(ArrayList<Teacher> people){
}

应对这个问题,我们可以便可以将本篇文章引入的知识“通配符”放在实际应用中解决问题了,通过其简短的概念“?可以在‘使用泛型’的时候代表一切类型”就可以理解其作用了,这里我们可以使用“?”共同代表两种类型。

public static void pk(ArrayList<?> people){
//通过通配符?便可以将这个问题解决掉
    }

 上下限 

然而此时又出现一个问题,定义了一个dog类,试图创建一些对象并传入集合中混入比赛,这种当然情况当然是不允许发生的,然而?是可以表示任意类型的,并不能对其进行限制。因此上下限的作用就体现出来了:

  •  上限:,传入类型必须是该父类或者是父类的子类
  • 下限:,传入类型必须是该子类或者是子类的父类
public static void pk(ArrayList<? extends People> people){
//通过上下限便可以将这个问题解决掉
//要求传入的类型必须是People的子类才可以
    }

推荐学习:《java视频教程

以上是一起來理解Java中的泛型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除