ジェネリック

ジェネリックとは、メソッドやクラス、変数の型を、宣言時ではなく実行時に

指定(定義)できるもの。

例えば、以下の様なメソッドにおいてint型以外も処理したい場合に、

使用したい型の数だけ同じようなメソッドを作成する必要がでてくる。

 

public void changeVal(int a = 100,int b = 200)
{
 int c;
 c = a;
 a = b;
 b = c;
}

これをジェネリックを使うことで、宣言じではなく使用時に型を指定できるように

なり、同じようなメソッドを複数定義する必要はなくなる。

 

public void changeVal<T>(ref T a ,ref T b )
{
c;
c = a;
a = b;
b = c;
}

public execTest()
{
double a = 1.0;
double b = 2.0;
changeVal<double>(ref a, ref b);
}

■構文

・メソッド名<T>()

 Tを型パラメータという。

 Tはなんでもよいが、慣例としてTが使用されることが多い。

 

・複数の型定義

 public void メソッド名<T,K>(ref T a ,ref K b ){}

 

 

ジェネリックなクラス

ジェネリックは、クラスやインターフェース、デリゲートにも適用

できる。

以下に、ジェネリックなクラスのサンプルを示す。

 

public class Array<T>
{
 private T[] m_Items;

 public void Set(int index, T item)
 {
  m_Items[index] = item;
 }
 public T Get(int index)
 {
  return m_Items[index];
 }
}

public void execTest2()
{
Array<int> test = new Array<int>();
test.Set(1, 100);
}

 

 ■共変性と反変性

 ジェネリックでは、通常、型パラメータに基底クラスを指定したオブジェクトに、

子クラスを指定したオブジェクトを代入できない。(通常のクラスや変数定義なら

できるのにね)

これを可能にするのが、in、out。