1. 程式人生 > 程式設計 >Java 泛型全解析

Java 泛型全解析

泛型簡介

什麼是泛型?

  • 參化型別,數是JDK1.5的新特性。(定義泛型時使用引數可以簡單理解為形參),例如List<E>,Map<K,V>
  • 編譯時的一種型別,此型別僅僅在編譯階段有效,執行時無效.例如List<String>在執行時String會被擦除,最終系統會認為都是Object.

為什麼要使用泛型?

泛型是進行型別設計或方法定義時的一種約束規範,基於此規範可以:

  1. 提高程式設計時靈活性(有點抽象,後續結合例項理解)。
  2. 提高程式執行時的效能。(在編譯階段解決一些執行時需要關注的問題,例如強轉)

說明:泛型應用相對比較簡單,難點在泛型類或方法的設計上,通過這樣的設計如何對現有類進行減法設計,提高類或方法的通用性.

泛型應用型別

泛型定義時常用方式有三種(可參考List<E>,V)等介面定義):

  1. 泛型類:class 類名<泛型,…>{}
  2. 泛型介面:interface 介面名<泛型,…>{}
  3. 泛型方法: <泛型> 方法返回值型別 方法名(形參){}

泛型類定義及應用

類泛型定義:(用於約束類中方法引數和方法返回值型別)

class Array<T>{//類泛型:類名<泛型>
  Object[] array=new Object[10];
  public void add(T t){}//通過類泛型約束方法引數型別
  public T get(int i){//通過類泛型約束方法返回值型別
    return (T)array[i];
  }
}

泛型介面定義及應用

定義介面時指定泛型,用於約束介面方法引數型別以及方法返回值類

interface Task<Param,Result>{//思考map中的泛型Map<K,V>
  /**
   * 此方法用於執行任務
   * @param arg 其型別由泛型引數Param決定
   * @return 其型別由泛型引數result決定
   */
  Result execute(Param arg);
}

泛型介面應用實踐

class ConvertTask implements Task<String,Integer>{
  @Override
  public Integer execute(String arg) {
    // TODO Auto-generated method stub
    return Integer.parseInt(arg);
  }
}

泛型定義及應用

泛型方法中的泛型僅僅應用於當前方法,主要應用於一些靜態方法,當然非靜態方法也可以應用。

class ObjectFactory{
  /**泛型方法*/
  public static <T>T newInstance(Class<T> cls){
    return (T)cls.newInstance();
  }
}

泛型應用萬用字元應用

無界限定萬用字元

泛型無界萬用字元使用”?”進行表示,可以代表一種任意引數型別(實參型別)。一般應用於變數的定義。例如:Class<?> c1;

Class<?> c=Class.forName("java.util.Date");

上屆界限定萬用字元

泛型上屆限定符通過“<? extends 型別>”方式進行實現,主要用於方法引數或方法的返回值型別,例如:

static void doPrint(List<? extends CharSequence> list){
    System.out.println(list);
}

下屆限定萬用字元

泛型下屆限定符通過“<? super 型別>”方式進行實現,主要用於方法引數或方法的返回值型別,例如:

static void doPrint(Set<? super Integer> set){
    System.out.println(list);
}

泛型型別擦除實踐分析

泛型是編譯時的一種型別,在執行時無效,執行時候都會變成Object型別,例如:

ArrayList<String> list = new ArrayList<String>();
list.add("A");
//list.add(100);//直接不可以
//通過反射將100新增到集合
list.getClass().getMethod("add",Object.class).invoke(list,100);
System.out.println(list);

總結(Summary)

本小節對泛型的定義,應用場景,應用型別以及泛型的型別擦出進行了分析和實踐,希望在後續專案實踐中對泛型有一個更好的認識。

以上就是Java 泛型全解析的詳細內容,更多關於Java 泛型的資料請關注我們其它相關文章!