1. 程式人生 > >Java語言學習(十一):列舉型別和泛型

Java語言學習(十一):列舉型別和泛型

    Java中一個重要的型別:列舉,它可以用來表示一組取值範圍固定的變數,使用 enum 關鍵字定義列舉型別,其中元素不能重複,通常大寫表示。利用Java的反射機制,可以在執行時分析類,如檢視列舉型別的修飾符、父類和自定義方法等,下面簡單說下。

    (一)列舉型別

    定義一個簡單的列舉型別,如下:

public enum Position{
   EAST,SOUTH,WEST,NORTH
}

    利用Java反射機制分析類:

//獲取Class物件
Class<Position> eClass = Position.class;
String modify = Modifier.toString(eClass.getModifiers());
System.out.println("修飾符:"+modify);
System.out.println("父類:"+eClass.getSuperclass());

    輸出為:

修飾符:public static final
父類:class java.lang.Enum

    Enum類是所有列舉型別的父類,它是一個沒有抽象方法的抽象類。該類定義了列舉型別的常用方法,如列舉元素間的比較compareTo()和equals()方法、列舉元素定義的名稱name()方法等,可以使用“==”比較兩個列舉元素。

    列舉型別不能繼承,可以看做普通類,像定義方法,這裡就不做介紹了,基本很少用到。

    (二)泛型

    泛型是Java中的重要特性,使用泛型程式設計可以使程式碼獲得最大的重用。在使用泛型時要指明泛型的具體型別,避免型別轉換。

    定義一個棧結構的泛型類:

/*
 * 泛型:定義引數型別為T的泛型類
 */
public class Stack<T> {
    //使用T型別的連結串列儲存入棧的元素(簡化開發)
	private LinkedList<T> conter = new LinkedList<T>();
    //向棧中新增元素
	public void push(T t){
        conter.addFirst(t);
    }
    //從棧中刪除元素
	public T pop(){
        return conter.removeFirst();
    }
    //判斷連結串列是否為空
	public boolean empty(){
        return conter.isEmpty();
    }
}

    測試類:

public static void main(String[] args) {
    //建立棧物件,並指定引數型別
    Stack<String> stack = new Stack<String>();
    //新增元素
    stack.push("Java");
    stack.push("Php");
    stack.push("Python");
    //遍歷棧
	while(!stack.empty()){
        System.out.println((String)stack.pop());
    }
}

    泛型類就是含有一個或多個型別引數的類,泛型引數的命名一般使用單個的大寫字母,如上所示,且有一定的侷限性,像泛型型別的引數只能使用類型別,如String、Integer等,而不能使用基本資料型別,如int、float等,不能丟擲或捕獲泛型型別的例項,不能直接使用泛型陣列,不能例項化型別變數等。

    Java中的泛型不支援例項化型別變數,如 “T[] arr = new T[10];”,屬於非法的語句。對於某些不足之處,可以使用Java反射機制進行彌補,如泛型陣列,這裡不做介紹了,大家感興趣的可以自行百度檢視。

    在Java中,不僅可以宣告泛型類,還可以在普通類中宣告泛型方法。宣告泛型方法需要注意:

  • 使用<T>格式來表示泛型型別引數,引數的個數可以多個;
  • 型別引數列表要放在訪問許可權修飾符、static和final之後;
  • 型別引數列表要放在返回值型別、方法名稱、方法引數之前;

    簡單的宣告如下所示:

public static <T> List<T> query(String sql){}

     利用泛型型別引數<T>可以將類、方法或介面的型別限制為T型別,但不夠靈活。Java中可以使用萬用字元增強泛型,使用“?”作為萬用字元,可以利用extends關鍵字來設定取值的上限,如:“<? extends Number>”表示Byte、Double、Float、Integer等都適合這個型別引數。另外還可以設定取值下限,這裡不做介紹了。

    泛型在Java中的一個應用:查詢。在資料結構中,查詢有很多型別,如順序查詢、折半查詢、雜湊查詢等,這裡有泛型化的折半查詢法,大家感興趣的可自行學習。

    好了,上面就是一些關於Java中列舉型別和泛型的知識總結,希望大家喜歡。