c#的泛型沒有類型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM並不支持泛型,只是語法糖,在編譯器編譯的時候都轉換成object類型
類型通配符在java中表示的是泛型類型的父類
public void test(List<Object> c) { for(int i = 0;i < c.size();i++) { System.out.println(c.get(i)); } }//創建一個List<String>對象List<String> strList = new ArrayList<String>(); //將strList作為參數來調用前面的test方法test(strList);
編譯上面的程序,test(strList) 處將發生編譯錯誤,意味著不能把List<String> 當成List<Object> 的子類. 這時候就需要使用類型通配符了,通配符是一個?號
上面的List<Object>換成List<?>就可以通過編譯了
public void test(List<?> c) { for(int i = 0;i < c.size();i++) { System.out.println(c.get(i)); } }List<String> 可以作為List<?> 的子類來使用, List<?> 則可作為任何List 類型的父類使用,
如果只想作為List<String>的父類,而不是List<int>呢,? 寫成這樣List<? extends String>
在C#中約束泛弄類型是這樣
class MyClass<T, U> where T : class where U : struct {} interface IMyInterface { } class Dictionary<TKey, TVal> where TKey : IComparable, IEnumerable where TVal : IMyInterface { public void Add(TKey key, TVal val) { } }Java 中約束泛型通配符上限:
//表明T類型必須是Number類或其子類,並必須實現java.io.Serializable接口Public class Apple<T extends Number & java.io.Serializable> {}以上就是小編為大家帶來的Java泛型類型通配符和C#對比分析全部內容了,希望大家多多支持武林網~