源型別
源型別是乙個名字,乙個沒有任何型別引數的泛型類或者介面的名字。比如說例子中的泛型類 box
public class box
// ... }
去建立乙個box的引數化型別(parameterized type),你需要為型別引數(type parameter)t提供乙個type argument:
boxintbox = new box<>();
如果type argument被省略了,你就建立了乙個box的源型別:
box rawbox = new box()
所以,box是泛型box的源型別,但是乙個非泛型類或者介面不是乙個源型別。
源型別已經被廢棄了,因為在jdk 5.0之前,很多api的類都不是泛化的。為了向後相容,把乙個parameterized type 賦值給乙個源型別是運允許的。比如:
boxstringbox = new box<>();
box rawbox = stringbox; // ok
但是如果把乙個源型別賦給乙個parameterized type,你會得到警告:
box rawbox = new box(); // rawbox is a raw tpe of box
boxintbox = rawbox; // warning: unchecked conversion
如果你用源型別去呼叫乙個已經泛化的方法(generic methods),這個泛化方法是在相對應的泛型中定義了,也會得到警告:
boxstringbox = new box<>();
box rawbox = stringbox;
rawbox.set(8); //warning: unchecked invocation to set(t)
一句話,避免使用源型別
C 泛型基礎(二)之泛型型別約束
泛型雖然在例項化時可以指定為任意型別,但是實際業務中,並不是都需要這樣,更多的時候因為業務邏輯而需要新增一些約束。泛型新增約束使用where子句,如listwhere t class表示t只能是引用型別。下文將展示泛型約束的基本用法與基本概念。一 約束型別 約束型別有六種,分別是class,stru...
C 泛型型別 泛型方法
泛型會宣告型別引數 泛型的消費者需要提供型別引數來把佔位符型別填充 public class stack var stack newstack int stack.push 2 stack.push 3 int x stack.pop 2int y stack.pop 3stack open typ...
泛型 二 泛型委託
using system using system.collections.generic using system.linq using system.text namespace 泛型委託 public event stackeventhandler,stackeventargs stackev...