標籤:print 作用 區別 [] java eric 對象 改變 pre
1、限制泛型可用類型
Java
文法如下:
class 類名稱<T extends anyClass> 其中,anyClass指摸個介面或類。
使用泛型限制後,泛型類的類型必須實現或繼承了anyClass這個介面或類。無論anyClass是介面還是類,在進行泛型限制時都必須使用extends關鍵字。
舉例如下:
import java.util.*;public class LimitClass<T extends List> { public static void main(String[] args) { //可以執行個體化已經實現了List介面的類 LimitClass<ArrayList> l1=new LimitClass<ArrayList>(); LimitClass<LinkedList> l2=new LimitClass<LinkedList>(); //下面這句是錯誤的,因為HashMap沒有實現List()介面 //LimitClass<HashMap> l3=new LimitClass<HashMap>(); }}
C#
where 關鍵字
2、使用類型萬用字元
Java
(1)在泛型機制中,提供了類型萬用字元,其主要作用是在建立一個泛型類對象時限制這個泛型類的類型實現或繼承某個介面或類的子類。要聲明這樣一個對象可以使用"?"萬用字元來表示,同時使用extends關鍵字來對泛型加以限制。
文法如下:
泛型類名稱<? extends List> a=null;
舉例如下:
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class WildcardClass<T> { public static void main(String[] args) { WildcardClass<? extends List> a = null; a = new WildcardClass<ArrayList>(); a = new WildcardClass<LinkedList>(); // 下面這句是錯誤的,因為HashMap沒有實現List()介面 // a=new WildcardClass<HashMap>(); }}
(2)A<?>
使用A<?>這種形式執行個體化泛型類對象,則預設表示可以將A指定為執行個體化Object及以下的子類類型。
舉例如下:
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class WildcardClassTwo { public static void main(String[] args) { List<String> l1 = new ArrayList<String>(); l1.add("成員"); List<?> l2 = l1; List<?> l3 = new LinkedList<Integer>(); System.out.println(l2.get(0)); }}
List<?>類型的對象可以接受String類型的ArrayList集合,也可以接受Integer類型的LinkedList集合。
那List<?> l2=l1語句與List l2=l1存在何種本質區別?
使用萬用字元聲明的名稱執行個體化的對象不能對其加入新的資訊,只能擷取或刪除。
import java.util.ArrayList;import java.util.LinkedList;import java.util.List;public class WildcardClassTwo { public static void main(String[] args) { List<String> l1 = new ArrayList<String>(); l1.add("成員"); List<?> l2 = l1; List<?> l3 = new LinkedList<Integer>(); System.out.println(l2.get(0)); l1.set(0, "成員改變"); // 使用萬用字元的對象調用set()方法,不能被調用 // l2.set(0, "成員改變"); // 可以使用l2的執行個體擷取集合中的值 l2.get(0); // 根據鍵名刪除集合中的值 l2.remove(0); }}
從執行個體可以看出,由於對象l1是沒有使用A<?>這種形式初始化出來的對象,所以它可以調用set()方法改變集合中的值,但l2則是通過使用萬用字元的方式建立出來的,所以不能改變集合中的值。
Code
JavaCode-->JavaVSNet/genericDemo
C#Code-->
Java(C#)基礎差異-泛型