1. 程式人生 > >Java,泛型類型通配符和C#對照

Java,泛型類型通配符和C#對照

size list ack ace arr 類型通配符 語法 ++ net

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#對照