簡介
泛型其實並不是一種新的語言元素
首先看泛型的一個應用
在過去
List stringList=new LinkedList();
stringList
stringList
String str=(String)erator()
實際上第三行對String的類型轉換意義並不大
利用java的泛型機制
List<String> stringList=new LinkedList<String>();
stringList
stringList
String str=erator()
這樣做的好處是在定義容器的時候就指明了容器中的類型
另外這樣也提高了程序的可讀性
泛型類型的定義
下面是一個簡單的使用泛型類的定義
public class MyGenericClass<T> {
private T value;
public T getValue() {
return value;
}
public void setValue(T value) {
this
}
}
值得注意的一點是
public class MyGenericClass<T> {
public static T value;//錯誤的定義
}
此外
List<String> strList =new ArrayList<String>();
List<Object> objList=strList; //錯誤的賦值
不過這樣一段代碼是正確的
List<Object> strList =new ArrayList<Object>();
strList
統配類型
假設我們需要這樣一個函數
void printCollection(Collection c) {
Iterator i = erator();
for (k =
{
System
}
}
使用新的泛型特性我們可以這樣寫
void printCollection(Collection<Object> c)
{
for (Object e : c)
{
System
}
}
但是這樣有一個問題
為了解決這個問題
void printCollection(Collection<?> c)
{
for (Object e : c)
{
System
}
}
可以說Collection<?>是所有Collection的父類
再來看一段下面的代碼
private void clearAllMaps(Collection<Map> c)
{
for(Map m:c)
{
m
}
}
毫無疑問
private void clearAllMaps(Collection<? extends Map> c)
{
for(Map m:c)
{
m
}
}
類似於? extends Map之類的統配符稱為限定統配類型
假設一個對象h類型為Collection<HashMap>
List<HashMap<String
HashMap<String
m
h
clearAllMaps(h);
對於在類似於上面所說
public void addRectangle(List<? extends Shape> shapes)
{
shapes
}
這裡我們假設Rectangle是Shape的一個子類
不允許這樣寫的原因比較簡單
除了extends
{
c
}
泛型函數
我們在前面提到了統配類型
private void fromArrayToCollection(Object[] a
{
for (Object o : a)
{
c
}
}
那麼這個函數應該怎麼寫呢?我們可以通過對函數添加泛型參數的方法實現
private <T> void exfromArrayToCollection(T[] a
{
for (T o : a)
{
c
}
}
那麼
如果一個函數的參數類型與函數返回的參數沒有必然關聯
為了更清楚地說明這一點
class Collections {
static void swap(List<?> list
static <T> void copy (List<? super T> dest
}
其中swap函數實際上也可以這樣定義
static <T>void swap(List<T> list
但是注意到這裡泛型類型參數T只在參數中用到了一次
copy方法中
From:http://tw.wingwit.com/Article/program/Java/Javascript/201311/25360.html