泛型教程(二) 源型別

2021-07-24 12:45:34 字數 911 閱讀 7212

源型別

源型別是乙個名字,乙個沒有任何型別引數的泛型類或者介面的名字。比如說例子中的泛型類 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...