java泛型中T和?(通配符)的區別與使用聲明


原文:http://blog.csdn.net/jianghuxiaojin/article/details/51457773

 

類型本來有:簡單類型和復雜類型,引入泛型后把復雜類型分的更細了;

現在List<Object>, List<String>是兩種不同的類型;且無繼承關系;

泛型的好處如:
開始版本

  1. public void write(Integer i, Integer[] ia);
  2. public void write(Double d, Double[] da);


泛型版本

  public <T> void write(T t, T[] ta);


簡便了代碼

定義泛型

1.定義在類后面

緊跟類名后面

  public class TestClassDefine<T, S extends T>{}

 

定義泛型 T, S, 且S 繼承 T

 

2.定義在方法裝飾符后面
緊跟修飾符后面(public)

  public <T, S extends T> T testGenericMethodDefine(T t, S s){}


定義泛型 T, S, 且S 繼承 T

實例化泛型

1.實例化定義在類上的泛型
第一聲明類變量或者實例化時。例如

  1. List<String> list;
  2. list = new ArrayList<String>;


第二繼承類或者實現接口時。例如

 public class MyList<E> extends ArrayList<E> implements List<E> {...} 


2.實例化定義方法上的泛型
當調用范型方法時,編譯器自動對類型參數(泛型)進行賦值,當不能成功賦值時報編譯錯誤

通配符(?)
上面有泛型的定義和賦值;當在賦值的時候,上面一節說賦值的都是為具體類型,當賦值的類型不確定的時候,我們用通配符(?)代替了:

  1. List<?> unknownList;
  2. List<? extends Number> unknownNumberList;
  3. List<? super Integer> unknownBaseLineIntgerList;


在Java集合框架中,對於參數值是未知類型的容器類,只能讀取其中元素,不能向其中添加元素, 因為,其類型是未知,所以編譯器無法識別添加元素的類型和容器的類型是否兼容,唯一的例外是NULL

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM