一、泛型設計的初衷
泛型程式的設計方便讓相同的**邏輯被許多不同型別的物件所重用。
二、定義泛型介面、類
public
class pair
public
void
setk(k k)
public v getv()
public
void
setv(v v)
}}
二、定義泛型方法
public
t getvalue(t t)
三、型別變數限定
類或者方法的型別變數有時候需要加以約束。例如:
public
class
pair
extends
comparable
&serializable>
限定型別變數t要繼承comparable類以及實現serializable介面。
四、使用泛型的約束和侷限性
1. 不能使用基本型別作為限定型別
pair
//wrong
pair
<
integer
>
//right
2.泛型類只存在於編譯期,執行期只存在原始型別,在編譯成位元組碼時,泛型是被擦除了的,所以在執行期進行型別查詢只適用於原始型別。
a instanceof pair//wrong
3.不能建立泛型陣列
pair
<
string, integer
>
pair
=new
pair
<
string, integer
>[1
];//wrong
4.不能例項化型別變數
new t();//wrong
t.class;//wrong
new t;//wrong
可以採用這種方式:
public
static
t getinstance(classclazz) throws instantiationexception, illegalacces***ception
5.禁止使用帶有型別變數的靜態域和方法
public
class pair
}}
6.不能丟擲和捕獲泛型類的例項,泛型類不能擴充套件throwable介面,在異常規範中使用型別變數是可以的
public
class
problem
extends
exception{}//error
public
void dowork(class
t)catch(t e)//error
}public
void dowork(t t) throw tcatch(throwable e)//right
}
四、泛型型別的繼承規則
假設a 類繼承於b類,但是pair
與pair
不存在任何繼承關係。
五、萬用字元型別
1.pair<? extends a>
萬用字元子型別限定
? extends a geta();
void seta(? extends a
a);不能呼叫 seta, 編譯器不知道具體的例項型別,而geta則可以呼叫,用父類a接收就行。
2.pair<? super a>
萬用字元超型別限定
? super a geta();
void seta(? super a
a);不能呼叫geta, 因為編譯器不知道具體的父型別是什麼, 而seta則可以呼叫,a型別的例項及其子類例項均可以使用a型別的父類呼叫。
3.pair<?>
無限定萬用字元
? get()
void
set(?)
get的值只能賦值給object,set不能呼叫
Java 泛型總結
泛型指引數化型別的能力,可以定義帶泛型型別的類或方法,隨後編譯器會用具體的型別來替換它。在泛型產生之前,像集合的訪問都是靠強制型別轉換 public class arraylist public void add object o string filename string names.get 0...
Java泛型總結
1 泛型主要是用來年解決資料型別安全的問題,用標識來代替屬性的型別或者返回值的型別 2 在使用泛型的時候可以有以下幾種形式 泛型介面 泛型類 萬用字元做泛型引數 泛型方法 泛型陣列 3 以下通過 說明 package com.sun.demo 一 定義泛型介面 inte ce father 二 定義...
java泛型總結
1.概念 泛型實現了引數化型別的概念,其最初的目的是希望類或方法能夠具備最廣泛的表達能力。通俗來說就是為了避免轉換出錯,限制資料型別。通過解耦類或者方法與所使用的型別之間的約束。list thelist1 new arraylist arrays.aslist 1,2,3,string for ob...