天天看點

關于泛型的一些問題

一、泛型在任何運作時需要知道确切類型資訊的操作都将無法工作

二、泛型類型參數在聲明什麼類型就必須執行個體化什麼類型,類型繼承和多态不能用于泛型類型參數。

在執行個體化一個List的時候 指定一個泛型類型,如果這個類型是Fruit,那麼就代表後面所有繼承Fruit的子類都可以添加到目前的集合中;但是在指派的時候卻是使用的 Apple,那麼這個ArrayList 中的泛型定義就是 Apple類型,也就意味着後面對 這個 ArrayList 進行Add等操作都必須是Apple類型或者是Apple的子類;也就和前面的Fruit以及Fruit的子類自相沖突了;是以不允許這樣進行擦除。

三、List<? extends T> 這裡的T可以是任何類或者接口,?可以是T代表的這個類本身或子類;List<? super T>這裡?可以是T代表的這個類本身或它的父類;

四、泛型對象的泛型參數類型在聲明的時候确定

Holder<?> unbounded = new Holder<Long>();

這裡unbounded的泛型類型參數是未知的;因為進行了泛型轉型 擦除掉了。

五、泛型類對象做參數,使用方法的時候,傳遞的對象的泛型參數必須一緻

這三句話都是因為參數的泛型參數類型不對出錯。

這句沒出錯,說明參數可以為參數類型不确定的泛型。

六、 靜态方法中不能使用類的泛型。

七、要用到泛型的方法必須在方法聲明的時候聲明為泛型方法。

格式為:

八、泛型通配符

泛型通配符的主要作用是為了在方法調用時,泛型參數使用通配符就可以讓該參數類型不受限制。

1.使用類型 通配符:?,比如:List<?> ,Map<?,?>

List<?>是List<String>、List<Object>等各種泛型List的父類。

2. 讀取List<?>的對象list中的元素時,永遠是安全的,因為不管list的真實類型是什麼,它包含的都是Object。

3. 寫入list中的元素時,不行。因為我們不知道c的元素類型,我們不能向其中添加對象。唯一的例外是null,它是所有類型的成員。

•  将任意元素加入到其中不是類型安全的:

• Collection<?> c = new ArrayList<String>();

• c.add(new Object()); // 編譯時錯誤

•  因為我們不知道c 的元素類型,我們不能向其中添加對象

• add方法有類型參數E作為集合的元素類型。我們傳給add的任何參數都必須是一個未知類型的子類。因為我們不知道那是什麼類型,是以我們無法傳任何東西進去。

•  唯一的例外的是null ,它是所有類型的成員。

•  另一方面,我們可以調用get() 方法并使用其傳回值。傳回值是一個未知的類型,但是我們知道,它總是一個Object

• <?>

• 允許所有泛型的引用調用

• 舉例:

• <? extends Number> ( 無窮小 , Number]

• 隻允許泛型為Number及Number子類的引用調用

• <? super Number> [Number ,  無窮大)

• 隻允許泛型為Number及Number父類的引用調用

• <? extends Comparable>

• 隻允許泛型為實作Comparable接口的實作類的引用調用

下一篇: 關于Random

繼續閱讀