c#的泛型沒(méi)有類(lèi)型通配符,原因是.net的泛型是CLR支持的泛型,而Java的JVM并不支持泛型,只是語(yǔ)法糖,在編譯器編譯的時(shí)候都轉(zhuǎn)換成object類(lèi)型
類(lèi)型通配符在java中表示的是泛型類(lèi)型的父類(lèi)
1
2
3
4
5
6
7
|
public void test(List<Object> c) { for ( int i = 0 ;i < c.size();i++) { System.out.println(c.get(i)); } } |
1
2
3
4
|
//創(chuàng)建一個(gè)List<String>對(duì)象 List<String> strList = new ArrayList<String>(); //將strList作為參數(shù)來(lái)調(diào)用前面的test方法 test(strList); |
編譯上面的程序,test(strList) 處將發(fā)生編譯錯(cuò)誤,意味著不能把List<String> 當(dāng)成List<Object> 的子類(lèi). 這時(shí)候就需要使用類(lèi)型通配符了,通配符是一個(gè)?號(hào)
上面的List<Object>換成List<?>就可以通過(guò)編譯了
1
2
3
4
5
6
7
|
public void test(List<?> c) { for ( int i = 0 ;i < c.size();i++) { System.out.println(c.get(i)); } } |
List<String> 可以作為 List<?> 的子類(lèi)來(lái)使用, List<?> 則可作為任何List 類(lèi)型的父類(lèi)使用,
如果只想作為L(zhǎng)ist<String>的父類(lèi),而不是List<int>呢,? 寫(xiě)成這樣 List<? extends String>
在C#中約束泛弄類(lèi)型是這樣
1
2
3
4
|
class MyClass<T, U> where T : class where U : struct {} |
1
2
3
4
5
6
7
8
9
10
11
12
|
interface IMyInterface { } class Dictionary<TKey, TVal> where TKey : IComparable, IEnumerable where TVal : IMyInterface { public void Add(TKey key, TVal val) { } } |
Java 中約束泛型通配符上限:
1
2
3
|
//表明T類(lèi)型必須是Number類(lèi)或其子類(lèi),并必須實(shí)現(xiàn)java.io.Serializable接口 Public class Apple<T extends Number & java.io.Serializable> {} |
以上就是小編為大家?guī)?lái)的Java泛型類(lèi)型通配符和C#對(duì)比分析全部?jī)?nèi)容了,希望大家多多支持服務(wù)器之家~