ジェネリックメソッド
日本語 | 総称関数 |
英語 | generic method |
ふりがな | じぇねりっくめそっど |
フリガナ | ジェネリックメソッド |
メソッドの引数やローカル変数の型を、呼び出す際に指定できるメソッド。
J2SE 5.0で追加された構文。
メソッド定義の際に、アクセス修飾子の右に「<T>」という「型パラメーター」を指定すると、そのメソッドはジェネリックメソッドとなる。
ジェネリックメソッド内では、この型パラメーター「<T>」で指定した「T」という単語が、任意の型に置き換えられるようになる。
型の指定は、引数をT型にすれば、渡した変数やリテラルの型によって自動的に指定できる。
また、メソッド名の左側に「<型名>」を付けることで明示することもできる。たとえば「<String>」を付けると、TがStringに置き換わる形となる。
型にはクラスやインターフェイスといった参照型しか指定できない。プリミティブ型を指定することはできない。
ただしボクシング変換が機能するため、引数にプリミティブ型を渡すと自動的に対応するラッパークラスが指定される。
J2SE 5.0で追加された構文。
メソッド定義の際に、アクセス修飾子の右に「<T>」という「型パラメーター」を指定すると、そのメソッドはジェネリックメソッドとなる。
ジェネリックメソッド内では、この型パラメーター「<T>」で指定した「T」という単語が、任意の型に置き換えられるようになる。
型の指定は、引数をT型にすれば、渡した変数やリテラルの型によって自動的に指定できる。
また、メソッド名の左側に「<型名>」を付けることで明示することもできる。たとえば「<String>」を付けると、TがStringに置き換わる形となる。
型にはクラスやインターフェイスといった参照型しか指定できない。プリミティブ型を指定することはできない。
ただしボクシング変換が機能するため、引数にプリミティブ型を渡すと自動的に対応するラッパークラスが指定される。
参考サイト
- (参考サイトはありません)
// Sample.java
/**
* ジェネリックメソッドを持つクラス。
*/
class HasGenericMethod
{
/**
* toString()メソッドを呼び出すジェネリックメソッド。
*/
// ↓↓↓これが付くとジェネリックメソッドになります。
public <T> void callToString( T t )
{
// T型の引数tのtoString()メソッドを呼び出して
// 出力します。
String string = t.toString();
System.out.println( string );
// 出力結果は渡した値次第です。
// 型変数Tは、渡した引数によって変わります。
// ただし、Tが何らかのクラスとみなした処理は
// 書けません。この例の場合はObjectクラスの
// メソッドしか使えません。
// ※コンパイルエラーの例
// t.abc();
// ※javacのエラーメッセージ
// シンボルを見つけられません。
// シンボル: メソッド abc()
// 場所 : java.lang.Object の クラス
// ※Eclipseのエラーメッセージ
// メソッド abc() は型 T で未定義です
// ※コンパイルエラーの例ここまで
}
}
public class Sample
{
public static void main( String[] args )
{
HasGenericMethod generic = new HasGenericMethod();
// Integerクラスのインスタンスへの参照を
// callToString()メソッドに渡して呼び出します。
Integer integer = new Integer( 100 );
generic.callToString( integer );
// 100
// Stringクラスのインスタンスへの参照を
// callToString()メソッドに渡して呼び出します。
String string = "あいうえお";
generic.callToString( string );
// あいうえお
// このように、callToString()メソッドの引数の型Tは
// 渡した参照型によって変わります。
// 型変数にプリミティブ型を使用することはできません。
// ただし、ボクシング変換を使用して渡すことが
// 可能です。
int i = 200;
generic.callToString( i );
// 200
// この場合、型変数にはラッパークラスが指定され
// (上記の場合、TにIntegerクラスが指定されます)
// ボクシング変換が行われて渡されます。
// ちなみに以下のように、型を明示的に指定する
// こともできます。
generic.<Object>callToString( 300 );
// 300
}
}
/**
* ジェネリックメソッドを持つクラス。
*/
class HasGenericMethod
{
/**
* toString()メソッドを呼び出すジェネリックメソッド。
*/
// ↓↓↓これが付くとジェネリックメソッドになります。
public <T> void callToString( T t )
{
// T型の引数tのtoString()メソッドを呼び出して
// 出力します。
String string = t.toString();
System.out.println( string );
// 出力結果は渡した値次第です。
// 型変数Tは、渡した引数によって変わります。
// ただし、Tが何らかのクラスとみなした処理は
// 書けません。この例の場合はObjectクラスの
// メソッドしか使えません。
// ※コンパイルエラーの例
// t.abc();
// ※javacのエラーメッセージ
// シンボルを見つけられません。
// シンボル: メソッド abc()
// 場所 : java.lang.Object の クラス
// ※Eclipseのエラーメッセージ
// メソッド abc() は型 T で未定義です
// ※コンパイルエラーの例ここまで
}
}
public class Sample
{
public static void main( String[] args )
{
HasGenericMethod generic = new HasGenericMethod();
// Integerクラスのインスタンスへの参照を
// callToString()メソッドに渡して呼び出します。
Integer integer = new Integer( 100 );
generic.callToString( integer );
// 100
// Stringクラスのインスタンスへの参照を
// callToString()メソッドに渡して呼び出します。
String string = "あいうえお";
generic.callToString( string );
// あいうえお
// このように、callToString()メソッドの引数の型Tは
// 渡した参照型によって変わります。
// 型変数にプリミティブ型を使用することはできません。
// ただし、ボクシング変換を使用して渡すことが
// 可能です。
int i = 200;
generic.callToString( i );
// 200
// この場合、型変数にはラッパークラスが指定され
// (上記の場合、TにIntegerクラスが指定されます)
// ボクシング変換が行われて渡されます。
// ちなみに以下のように、型を明示的に指定する
// こともできます。
generic.<Object>callToString( 300 );
// 300
}
}
// Sample.java /** * ジェネリックメソッドを持つクラス。 */ class HasGenericMethod { /** * toString()メソッドを呼び出すジェネリックメソッド。 */ // ↓↓↓これが付くとジェネリックメソッドになります。 public <T> void callToString( T t ) { // T型の引数tのtoString()メソッドを呼び出して // 出力します。 String string = t.toString(); System.out.println( string ); // 出力結果は渡した値次第です。 // 型変数Tは、渡した引数によって変わります。 // ただし、Tが何らかのクラスとみなした処理は // 書けません。この例の場合はObjectクラスの // メソッドしか使えません。 // ※コンパイルエラーの例 // t.abc(); // ※javacのエラーメッセージ // シンボルを見つけられません。 // シンボル: メソッド abc() // 場所 : java.lang.Object の クラス // ※Eclipseのエラーメッセージ // メソッド abc() は型 T で未定義です // ※コンパイルエラーの例ここまで } } public class Sample { public static void main( String[] args ) { HasGenericMethod generic = new HasGenericMethod(); // Integerクラスのインスタンスへの参照を // callToString()メソッドに渡して呼び出します。 Integer integer = new Integer( 100 ); generic.callToString( integer ); // 100 // Stringクラスのインスタンスへの参照を // callToString()メソッドに渡して呼び出します。 String string = "あいうえお"; generic.callToString( string ); // あいうえお // このように、callToString()メソッドの引数の型Tは // 渡した参照型によって変わります。 // 型変数にプリミティブ型を使用することはできません。 // ただし、ボクシング変換を使用して渡すことが // 可能です。 int i = 200; generic.callToString( i ); // 200 // この場合、型変数にはラッパークラスが指定され // (上記の場合、TにIntegerクラスが指定されます) // ボクシング変換が行われて渡されます。 // ちなみに以下のように、型を明示的に指定する // こともできます。 generic.<Object>callToString( 300 ); // 300 } }