溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入淺析Java 中的泛型

發布時間:2020-11-06 17:06:42 來源:億速云 閱讀:513 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關深入淺析Java 中的泛型,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

泛型簡介

什么是泛型?

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

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

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

泛型應用類型

泛型定義時常用方式有三種(可參考List<E>,Map<K,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();
  }
}

泛型應用通配符應用

無界限定通配符

泛型無界通配符使用”&#63;”進行表示,可以代表一種任意參數類型(實參類型)。一般應用于變量的定義。例如:Class<&#63;> c1;

Class<&#63;> c=Class.forName("java.util.Date");

上屆界限定通配符

泛型上屆限定符通過“<&#63; extends 類型>”方式進行實現,主要用于方法參數或方法的返回值類型,例如:

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

下屆限定通配符

泛型下屆限定符通過“<&#63; super 類型>”方式進行實現,主要用于方法參數或方法的返回值類型,例如:

static void doPrint(Set<&#63; 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);

看完上述內容,你們對深入淺析Java 中的泛型有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女