ジェネリッククラス
日本語 | 総称型 |
英語 | generic class |
ふりがな | じぇねりっくくらす |
フリガナ | ジェネリッククラス |
クラス内の型を使用時に指定できるクラス。
J2SE 5.0で追加された構文。
クラス定義の際に、クラス名の右に「<T>」という「型パラメーター」を指定すると、そのクラスはジェネリッククラスとなる。
ジェネリッククラス内では、この型パラメーター「<T>」で指定した「T」という単語が、任意の型に置き換えられるようになる。
型の指定は、ジェネリッククラスを使用する際にクラス名の右側に「<型名>」を付けて行う。たとえば「<String>」を付けると、TがStringに置き換わる形となる。
ただし、型にはクラスやインターフェイスといった参照型しか指定できない。プリミティブ型を指定するとコンパイルエラーとなる。
また、ジェネリッククラス内の型Tで宣言した変数は、指定した型に関係なくObjectクラスの変数とみなされるため、当然メソッドもObjectクラスのものしか呼び出せない。型パラメーターの指定によっては他のクラスのメソッドを呼び出すこともできるが、いずれにせよTを指定したクラスとして自由に使用できるわけではない。
このように、ジェネリッククラスを使用しても自由度が上がるわけではない。むしろ、Objectクラスを使用していた箇所に制限を設けるのがジェネリッククラスのメリットである。
J2SE 5.0で追加された構文。
クラス定義の際に、クラス名の右に「<T>」という「型パラメーター」を指定すると、そのクラスはジェネリッククラスとなる。
ジェネリッククラス内では、この型パラメーター「<T>」で指定した「T」という単語が、任意の型に置き換えられるようになる。
型の指定は、ジェネリッククラスを使用する際にクラス名の右側に「<型名>」を付けて行う。たとえば「<String>」を付けると、TがStringに置き換わる形となる。
ただし、型にはクラスやインターフェイスといった参照型しか指定できない。プリミティブ型を指定するとコンパイルエラーとなる。
また、ジェネリッククラス内の型Tで宣言した変数は、指定した型に関係なくObjectクラスの変数とみなされるため、当然メソッドもObjectクラスのものしか呼び出せない。型パラメーターの指定によっては他のクラスのメソッドを呼び出すこともできるが、いずれにせよTを指定したクラスとして自由に使用できるわけではない。
このように、ジェネリッククラスを使用しても自由度が上がるわけではない。むしろ、Objectクラスを使用していた箇所に制限を設けるのがジェネリッククラスのメリットである。
参考サイト
- (参考サイトはありません)
// Sample.java
/**
* ジェネリッククラスの例。
*/
// これ↓↓が付くとジェネリッククラスになります。
class GenericClass<T>
{
// このクラス内では、「T」は指定された型になります。
// Integerクラスを指定すればTはIntegerに、
// Stringクラスを指定すればTはStringクラスになります。
/**
* privateなフィールド。
*/
private T data;
/**
* setter。
*/
public void setData( T value )
{
this.data = value;
}
/**
* getter。
*/
public T getData()
{
return data;
}
}
public class Sample
{
public static void main( String[] args )
{
// 型変数TにStringを指定して、GenericClassクラスの
// 参照型変数を作成します。
GenericClass<String> genericClass;
// 型変数TにStringを指定して、GenericClassクラスの
// インスタンスを作成し、その参照を上記の変数に
// 代入します。
genericClass = new GenericClass<String>();
// setData()メソッドの引数の型TはStringクラスに
// なるので、Stringクラスである文字列を渡せます。
genericClass.setData( "あいうえお" );
// 同じく、getData()メソッドの戻り値の型Tは
// Stringクラスになるので、Stringクラスの
// 参照型変数で受け取れます。
String s = genericClass.getData();
System.out.println( s );
// あいうえお
// このように、ジェネリッククラスはクラス内の型を
// 使用時に指定することができるわけです。
// ただし、その型ににプリミティブ型を指定することは
// できません。
// ※コンパイルエラーの例
// GenericClass<int> genericClass2;
// ※javacのエラーメッセージ
// 予期しない型
// 検出値 : int
// 期待値 : 参照
// ※Eclipseのエラーメッセージ
// トークン "int" に構文エラーがあります。
// このトークンの後には Dimensions を指定する必要があります
// ※コンパイルエラーの例ここまで
// このように、型変数Tには必ずクラスやインターフェイスを
// 指定します。
}
}
/**
* ジェネリッククラスの例。
*/
// これ↓↓が付くとジェネリッククラスになります。
class GenericClass<T>
{
// このクラス内では、「T」は指定された型になります。
// Integerクラスを指定すればTはIntegerに、
// Stringクラスを指定すればTはStringクラスになります。
/**
* privateなフィールド。
*/
private T data;
/**
* setter。
*/
public void setData( T value )
{
this.data = value;
}
/**
* getter。
*/
public T getData()
{
return data;
}
}
public class Sample
{
public static void main( String[] args )
{
// 型変数TにStringを指定して、GenericClassクラスの
// 参照型変数を作成します。
GenericClass<String> genericClass;
// 型変数TにStringを指定して、GenericClassクラスの
// インスタンスを作成し、その参照を上記の変数に
// 代入します。
genericClass = new GenericClass<String>();
// setData()メソッドの引数の型TはStringクラスに
// なるので、Stringクラスである文字列を渡せます。
genericClass.setData( "あいうえお" );
// 同じく、getData()メソッドの戻り値の型Tは
// Stringクラスになるので、Stringクラスの
// 参照型変数で受け取れます。
String s = genericClass.getData();
System.out.println( s );
// あいうえお
// このように、ジェネリッククラスはクラス内の型を
// 使用時に指定することができるわけです。
// ただし、その型ににプリミティブ型を指定することは
// できません。
// ※コンパイルエラーの例
// GenericClass<int> genericClass2;
// ※javacのエラーメッセージ
// 予期しない型
// 検出値 : int
// 期待値 : 参照
// ※Eclipseのエラーメッセージ
// トークン "int" に構文エラーがあります。
// このトークンの後には Dimensions を指定する必要があります
// ※コンパイルエラーの例ここまで
// このように、型変数Tには必ずクラスやインターフェイスを
// 指定します。
}
}
// Sample.java /** * ジェネリッククラスの例。 */ // これ↓↓が付くとジェネリッククラスになります。 class GenericClass<T> { // このクラス内では、「T」は指定された型になります。 // Integerクラスを指定すればTはIntegerに、 // Stringクラスを指定すればTはStringクラスになります。 /** * privateなフィールド。 */ private T data; /** * setter。 */ public void setData( T value ) { this.data = value; } /** * getter。 */ public T getData() { return data; } } public class Sample { public static void main( String[] args ) { // 型変数TにStringを指定して、GenericClassクラスの // 参照型変数を作成します。 GenericClass<String> genericClass; // 型変数TにStringを指定して、GenericClassクラスの // インスタンスを作成し、その参照を上記の変数に // 代入します。 genericClass = new GenericClass<String>(); // setData()メソッドの引数の型TはStringクラスに // なるので、Stringクラスである文字列を渡せます。 genericClass.setData( "あいうえお" ); // 同じく、getData()メソッドの戻り値の型Tは // Stringクラスになるので、Stringクラスの // 参照型変数で受け取れます。 String s = genericClass.getData(); System.out.println( s ); // あいうえお // このように、ジェネリッククラスはクラス内の型を // 使用時に指定することができるわけです。 // ただし、その型ににプリミティブ型を指定することは // できません。 // ※コンパイルエラーの例 // GenericClass<int> genericClass2; // ※javacのエラーメッセージ // 予期しない型 // 検出値 : int // 期待値 : 参照 // ※Eclipseのエラーメッセージ // トークン "int" に構文エラーがあります。 // このトークンの後には Dimensions を指定する必要があります // ※コンパイルエラーの例ここまで // このように、型変数Tには必ずクラスやインターフェイスを // 指定します。 } }