如何理解JAVA中的泛型?

泛型簡介

什麼是泛型?

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

爲何要使用泛型?

泛型是進行類型設計或方法定義時的一種約束規範,基於此規範能夠:java

  1. 提升編程時靈活性(有點抽象,後續結合實例理解)。
  2. 提升程序運行時的性能。(在編譯階段解決一些運行時須要關注的問題,例如強轉)
說明:泛型應用相對比較簡單,難點在泛型類或方法的設計上,經過這樣的設計如何對現有類進行減法設計,提升類或方法的通用性.

泛型應用類型

泛型定義時經常使用方式有三種(可參考List<E>,Map<K,V)等接口定義):編程

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

泛型類定義及應用

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

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);
    }
}

泛型定義及應用

泛型方法中的泛型僅僅應用於當前方法,主要應用於一些靜態方法,固然非靜態方法也能夠應用。code

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

泛型應用通配符應用

無界限定通配符

泛型無界通配符使用」?」進行表示,能夠表明一種任意參數類型(實參類型)。通常應用於變量的定義。例如:Class<?> c1;接口

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

上屆界限定通配符

泛型上屆限定符經過「<? extends 類型>」方式進行實現,主要用於方法參數或方法的返回值類型,例如:get

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

下屆限定通配符

泛型下屆限定符經過「<? super 類型>」方式進行實現,主要用於方法參數或方法的返回值類型,例如:編譯

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

泛型類型擦除實踐分析

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

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)

本小節對泛型的定義,應用場景,應用類型以及泛型的類型擦出進行了分析和實踐,但願在後續項目實踐中對泛型有一個更好的認識。

相關文章
相關標籤/搜索