java 泛型詳解(普通泛型、 萬用字元、 泛型介面,泛型陣列,泛型方法,泛型巢狀)
JDK1.5 令我們期待很久,可是當他釋出的時候卻更換版本號為5.0。這說明Java已經有大幅度的變化。本文將講解JDK5.0支援的新功能-----Java的泛型.
1、Java泛型
其實Java的泛型就是建立一個用型別作為引數的類。就象我們寫類的方法一樣,方法是這樣的method(String str1,String str2 ),方法中引數str1、str2的值是可變的。而泛型也是一樣的,這樣寫class Java_Generics<K,V>,這裡邊的K和V就象方法中的引數str1和str2,也是可變。
編寫泛型類要注意:
1) 在定義一個泛型類的時候,在 “<>”之間定義形式型別引數,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示型別。
2) 例項化泛型物件的時候,一定要在類名後面指定型別引數的值(型別),一共要有兩次書寫。例如:
TestGen<String,String> t=new TestGen<String,String>();
3) 泛型中<K extends Object>,extends並不代表繼承,它是類型範圍限制。
普通泛型
Java程式碼- class Point<T>{ // 此處可以隨便寫識別符號號,T是type的簡稱
- private T var ; // var的型別由T指定,即:由外部指定
- public T getVar(){ // 返回值的型別由外部決定
- return var ;
- }
- public void setVar(T var){ // 設定的型別也由外部決定
- this.var = var ;
- }
- };
- public class GenericsDemo06{
- public static void main(String args[]){
- Point<String> p = new Point<String>() ; // 裡面的var型別為String型別
- p.setVar("it") ; // 設定字串
- System.out.println(p.getVar().length()) ; // 取得字串的長度
- }
- };
- ----------------------------------------------------------
- class Notepad<K,V>{ // 此處指定了兩個泛型型別
- private K key ; // 此變數的型別由外部決定
- private V value ; // 此變數的型別由外部決定
- public K getKey(){
- return this.key ;
- }
- public V getValue(){
- return this.value ;
- }
- public void setKey(K key){
- this.key = key ;
- }
- public void setValue(V value){
- this.value = value ;
- }
- };
- public class GenericsDemo09{
- public static void main(String args[]){
- Notepad<String,Integer> t = null ; // 定義兩個泛型型別的物件
- t = new Notepad<String,Integer>() ; // 裡面的key為String,value為Integer
- t.setKey("湯姆") ; // 設定第一個內容
- t.setValue(20) ; // 設定第二個內容
- System.out.print("姓名;" + t.getKey()) ; // 取得資訊
- System.out.print(",年齡;" + t.getValue()) ; // 取得資訊
- }
- };
萬用字元
Java程式碼- class Info<T>{
- private T var ; // 定義泛型變數
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接列印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo14{
- public static void main(String args[]){
- Info<String> i = new Info<String>() ; // 使用String為泛型型別
- i.setVar("it") ; // 設定內容
- fun(i) ;
- }
- public static void fun(Info<?> temp){ // 可以接收任意的泛型物件
- System.out.println("內容:" + temp) ;
- }
- };
受限泛型
Java程式碼- class Info<T>{
- private T var ; // 定義泛型變數
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接列印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo17{
- public static void main(String args[]){
- Info<Integer> i1 = new Info<Integer>() ; // 宣告Integer的泛型物件
- Info<Float> i2 = new Info<Float>() ; // 宣告Float的泛型物件
- i1.setVar(30) ; // 設定整數,自動裝箱
- i2.setVar(30.1f) ; // 設定小數,自動裝箱
- fun(i1) ;
- fun(i2) ;
- }
- public static void fun(Info<? extends Number> temp){ // 只能接收Number及其Number的子類
- System.out.print(temp + "、") ;
- }
- };
- ----------------------------------------------------------
- class Info<T>{
- private T var ; // 定義泛型變數
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接列印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo21{
- public static void main(String args[]){
- Info<String> i1 = new Info<String>() ; // 宣告String的泛型物件
- Info<Object> i2 = new Info<Object>() ; // 宣告Object的泛型物件
- i1.setVar("hello") ;
- i2.setVar(new Object()) ;
- fun(i1) ;
- fun(i2) ;
- }
- public static void fun(Info<? super String> temp){ // 只能接收String或Object型別的泛型
- System.out.print(temp + "、") ;
- }
- };
泛型無法向上轉型
Java程式碼- class Info<T>{
- private T var ; // 定義泛型變數
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- public String toString(){ // 直接列印
- return this.var.toString() ;
- }
- };
- public class GenericsDemo23{
- public static void main(String args[]){
- Info<String> i1 = new Info<String>() ; // 泛型型別為String
- Info<Object> i2 = null ;
- i2 = i1 ; //這句會出錯 incompatible types
- }
- };
泛型介面
Java程式碼- interface Info<T>{ // 在介面上定義泛型
- public T getVar() ; // 定義抽象方法,抽象方法的返回值就是泛型型別
- }
- class InfoImpl<T> implements Info<T>{ // 定義泛型介面的子類
- private T var ; // 定義屬性
- public InfoImpl(T var){ // 通過構造方法設定屬性內容
- this.setVar(var) ;
- }
- public void setVar(T var){
- this.var = var ;
- }
- public T getVar(){
- return this.var ;
- }
- };
- public class GenericsDemo24{
- public static void main(String arsg[]){
- Info<String> i = null; // 宣告介面物件
- i = new InfoImpl<String>("湯姆") ; // 通過子類例項化物件
- System.out.println("內容:" + i.getVar()) ;
- }
- };
- ----------------------------------------------------------
- interface Info<T>{ // 在介面上定義泛型
- public T getVar() ; // 定義抽象方法,抽象方法的返回值就是泛型型別
- }
- class InfoImpl implements Info<String>{ // 定義泛型介面的子類
- private String var ; // 定義屬性
- public InfoImpl(String var){ // 通過構造方法設定屬性內容
- this.setVar(var) ;
- }
- public void setVar(String var){
- this.var = var ;
- }
- public String getVar(){
- return this.var ;
- }
- };
- public class GenericsDemo25{
- public static void main(String arsg[]){
- Info i = null; // 宣告介面物件
- i = new InfoImpl("湯姆") ; // 通過子類例項化物件
- System.out.println("內容:" + i.getVar()) ;
- }
- };
泛型方法
Java程式碼- class Demo{
- public <T> T fun(T t){ // 可以接收任意型別的資料
- return t ; // 直接把引數返回
- }
- };
- public class GenericsDemo26{
- public static void main(String args[]){
- Demo d = new Demo() ; // 例項化Demo物件
- String str = d.fun("湯姆") ; // 傳遞字串
- int i = d.fun(30) ; // 傳遞數字,自動裝箱
- System.out.println(str) ; // 輸出內容
- System.out.println(i) ; // 輸出內容
- }
- };
通過泛型方法返回泛型型別例項
Java程式碼- class Info<T extends Number>{ // 指定上限,只能是數字型別
- private T var ; // 此型別由外部決定
- public T getVar(){
- return this.var ;
- }
- public void setVar(T var){
- this.var = var ;
- }
- public String toString(){ // 覆寫Object類中的toString()方法
- return this.var.toString() ;
- }
- };
- public class GenericsDemo27{
- public static void main(String args[]){
- Info<Integer> i = fun(30) ;
- System.out.println(i.getVar()) ;
- }
- public static <T extends Number> Info<T> fun(T param){//方法中傳入或返回的泛型型別由呼叫方法時所設定的引數型別決定
- Info<T> temp = new Info<T>() ; // 根據傳入的資料型別例項化Info
- temp.setVar(param) ; // 將傳遞的內容設定到Info物件的var屬性之中
- return temp ; // 返回例項化物件
- }
- };
使用泛型統一傳入的引數型別
Java程式碼- class Info<T>{ // 指定上限,只能是數字型別
- private T var ; // 此型別由外部決定
- public T getVar(){
- return this.var ;
- }
- public void setVar(T var){
- this.var = var ;
- }
- public String toString(){ // 覆寫Object類中的toString()方法
- return this.var.toString() ;
- }
- };
- public class GenericsDemo28{
- public static void main(String args[]){
- Info<String> i1 = new Info<String>() ;
- Info<String> i2 = new Info<String>() ;
- i1.setVar("HELLO") ; // 設定內容
- i2.setVar("湯姆") ; // 設定內容
- add(i1,i2) ;
- }
- public static <T> void add(Info<T> i1,Info<T> i2){
- System.out.println(i1.getVar() + " " + i2.getVar()) ;
- }
- };
泛型陣列
Java程式碼- public class GenericsDemo30{
- public static void main(String args[]){
- Integer i[] = fun1(1,2,3,4,5,6) ; // 返回泛型陣列
- fun2(i) ;
- }
- public static <T> T[] fun1(T...arg){ // 接收可變引數
- return arg ; // 返回泛型陣列
- }
- public static <T> void fun2(T param[]){ // 輸出
- System.out.print("接收泛型陣列:") ;
- for(T t:param){
- System.out.print(t + "、") ;
- }
- }
- };
泛型的巢狀設定
Java程式碼- class Info<T,V>{ // 接收兩個泛型型別
- private T var ;
- private V value ;
- public Info(T var,V value){
- this.setVar(var) ;
- this.setValue(value) ;
- }
- public void setVar(T var){
- this.var = var ;
- }
- public void setValue(V value){
- this.value = value ;
- }
- public T getVar(){
- return this.var ;
- }
- public V getValue(){
- return this.value ;
- }
- };
- class Demo<S>{
- private S info ;
- public Demo(S info){
- this.setInfo(info) ;
- }
- public void setInfo(S info){
- this.info = info ;
- }
- public S getInfo(){
- return this.info ;
- }
- };
- public class GenericsDemo31{
- public static void main(String args[]){
- Demo<Info<String,Integer>> d = null ; // 將Info作為Demo的泛型型別
- Info<String,Integer> i = null ; // Info指定兩個泛型型別
- i = new Info<String,Integer>("湯姆",30) ; // 例項化Info物件
- d = new Demo<Info<String,Integer>>(i) ; // 在Demo類中設定Info類的物件
- System.out.println("內容一:" + d.getInfo().getVar()) ;
- System.out.println("內容二:" + d.getInfo().getValue()) ;
- }
- };
相關推薦
java 泛型詳解(普通泛型、 萬用字元、 泛型介面,泛型陣列,泛型方法,泛型巢狀)
JDK1.5 令我們期待很久,可是當他釋出的時候卻更換版本號為5.0。這說明Java已經有大幅度的變化。本文將講解JDK5.0支援的新功能-----Java的泛型. 1、Java泛型 其實Java
day26基礎加強(泛型、萬用字元、註解、反射 註解使用)
泛型 1、具有一個或多個泛型變數的型別被稱之為泛型類 class A<T>{} 2、在建立泛型類例項時,需要為其型別變數賦值 A<String> a = new A<String>(); 如果建立例項時,不給型別變數賦值,那麼會有一個警告。 3
java基礎總結 --- 泛型 擦除、邊界、萬用字元、
* 擦除的問題 * 為什麼要擦除: 1.5版本才出現泛型 為了相容之前地程式碼 * 它使得泛化的客戶端可以用非泛化的類庫來使用。 * 以及不破壞現有類庫的情況下,將泛型融入java語言。 * 擦除使得現有的非泛型客戶端程式碼能夠在不改變的情況繼續使用,直至客戶端準
Elasticsearch-字首、萬用字元、正則、模糊搜尋詳解
1.對於字首的匹配搜尋: GET /forum/article/_search { "query": { "prefix": { "articleID": { "value": "J" } }
分享知識-快樂自己:Struts2(動態方法、動態結果、萬用字元、方法內部跳轉、action跳轉、OGNL 的使用及注意事項)
這裡主要以案例演示:涵蓋以下知識點 1、動態方法呼叫:使用關鍵 符號 ! 進行操作 例如:/名稱空間 ! 方法名 2、動態結果集:就是說,通過後臺返回的結果 ${} 獲取,重定向到符合預期的頁面。 3、萬能萬用字元:*_* :第一個 * 為 類名、第二個 * 為方
shell學習筆記(一):for迴圈、if語句、萬用字元、命令代換、引號
一、for迴圈for 變數in列表docommand1command2......done例1:vim test.sh#! /bin/bashfor str in name.listdoecho $strdone例2:vim tesh.sh#! /bin/bash for((
Java技術——Java泛型詳解(轉)
cal 5.1 try 既然 參數 top 兩種 泛型編程 編譯器 1.為什麽需要泛型轉載請註明出處:http://blog.csdn.net/seu_calvin/article/details/52230032泛型在Java中有很重要的地位,網上很多文章羅列各種理論,不
Java 之路 (十六) -- 泛型下(萬用字元、型別擦除、泛型的限制)
7. 萬用字元 萬用字元,即 “?”,用來表示未知型別。 萬用字元可用作各種情況:作為引數,欄位或區域性變數的型別;有時也作為返回型別;萬用字元從不用作泛型方法呼叫、泛型類例項建立或超型別的型別引數。 7.1 上限有界的萬用字元 使用上限萬用字元來放
java.util包詳解(二)——Connection接口
操作 相同 元素 叠代 cat roo soft true nbsp Connection接口介紹 Connection接口是java集合的root接口,沒有實現類,只有子接口和實現子接口的各種容器。主要用來表示java集合這一大的抽象概念。 Connection接
29-泛型--泛型限定(泛型上限+泛型下限+上限的體現+下限的體現+萬用字元的體現)+集合查閱的技巧
一、泛型上限 1、迭代並列印集合中的元素 (1)集合即可能是List,也可能是Set,用Collection提高擴充套件性 (2)當容器中存放的元素不確定,且裡面不準備使用具體型別的情況下,使用萬用字元 注: (1)萬用字元:?,未知型別。不明確型別時,可以用?來表示,意味著什麼
Java Scanner 類詳解(附例子)學習
在筆試程式設計過程中,關於資料的讀取如果迷迷糊糊,那後來的程式設計即使想法很對,實現很好,也是徒勞,於是在這裡認真總結了Java Scanner 類的使用 通過 Scanner 類來獲取使用者的輸入,下面是建立 Scanner 物件的基本語法: Scanner s =
Java反射機制詳解(由淺入深)
一、什麼是Java反射機制? Java 反射機制在程式執行時,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性。這種 動態的獲取資訊 以及 動態呼叫物件的方法 的功能稱為 java 的反
Java 反射機制詳解(一)
Java 反射機制詳解(一) 主要介紹以下幾方面內容 理解 Class 類 理解 Java 的類載入機制 學會使用 ClassLoader 進行類載入 理解反射的機制 掌握 Constructor、Method、Field 類的用法 理解並掌握動態代理&n
Java 反射機制詳解(四)
Java 反射機制詳解(四) 4. 反射與泛型 定義一個泛型類: public class DAO<T> { //根據id獲取一個物件 T get(Integer id){ return null; }
JAVA設計模式詳解(三)----------裝飾者模式
今天LZ帶給大家的是裝飾者模式,提起這個設計模式,LZ心裡一陣激動,這是LZ學習JAVA以來接觸的第一個設計模式,也許也是各位接觸的第一個設計模式。記得當初老師在講IO的時候就提到過它:“是你還有你,一切拜託你。”沒錯,這就是裝飾者模式最簡潔的定義了。下面LZ引出標準的定義(
JAVA設計模式詳解(五)----------狀態模式
各位朋友,本次LZ分享的是狀態模式,在這之前,懇請LZ解釋一下,由於最近公司事情多,比較忙,所以導致更新速度稍微慢了些(哦,往後LZ會越來越忙=。=)。 狀態模式,又稱狀態物件模式(Pattern of Objects for States),狀態模式是物件的行為模式。
Java執行緒詳解(深度好文)
Java執行緒:概念與原理 一、程序與執行緒 程序是指一個記憶體中執行的應用程式,每個程序都有自己獨立的一塊記憶體空間,即程序空間或(虛空間)。程序不依賴於執行緒而獨立存在,一個程序中可以啟動多個執行緒。比如在Windows系統中,一個執行的ex
Javaweb學習筆記——(二十七)——————泛型、泛型的萬用字元、反射泛型資訊、反射註解、註解
泛型 1.泛型類:具有一個或多個型別變數的類,稱之為泛型類 class A<T>{ } 2.在建立泛型例項時,需要為其型別變數賦值 A<String> a = new A<String>();
【Java入門提高篇】Day34 Java容器類詳解(十五)WeakHashMap詳解
public class WeakHashMapTest { public static void main(String[] args){ testWeakHashMap(); } private static void testWeakHashMap
Effective Java 泛型 第28條:利用有限制萬用字元來提升API的靈活性
如第25條所述,引數化型別是 不可變的(invariant)。換句話說,對於任何兩個截然不同的型別tyle1和type2來說,List< Type1>既不是List< Type2>的子型別,也不是他的超型別。雖然List< Stri