アップキャスト
日本語 | upcast |
英語 | 上キャスト |
ふりがな | あっぷきゃすと |
フリガナ | アップキャスト |
あるクラスをスーパークラスへとキャストすること。
キャストの一種。と言っても、アップキャストは必ず「暗黙的キャスト」が可能なため、明示的にキャストする必要はない。
アップキャストでは「何も変化しない」という点が重要である。アップキャストする際、渡される参照の値や、その参照が指し示すインスタンスは全く変化しない。変わるのは、参照を格納する、参照型変数の型だけである。
この機能はポリモーフィズムのために存在する。格納する参照型変数のクラスが持つメソッドを呼び出した場合、インスタンスのクラスでオーバーライドされていれば、そのオーバーライドしたメソッドが呼び出される。アップキャストが暗黙的に可能なのは、ポリモーフィズムを実現するための言語仕様と考えた方がよい。
これに対し、サブクラスへとキャストすることを「ダウンキャスト」と呼ぶ。不用意なアップキャストは不必要なダウンキャストを強いられることもあり、バグが発生する可能性がある。本当にアップキャストが必要なのか、ポリモーフィズムの観点からも考慮した方が良いだろう。
ちなみに「up」なのは、クラスの継承関係において「スーパークラス」が「サブクラス」の「上」にあるためである。
キャストの一種。と言っても、アップキャストは必ず「暗黙的キャスト」が可能なため、明示的にキャストする必要はない。
アップキャストでは「何も変化しない」という点が重要である。アップキャストする際、渡される参照の値や、その参照が指し示すインスタンスは全く変化しない。変わるのは、参照を格納する、参照型変数の型だけである。
この機能はポリモーフィズムのために存在する。格納する参照型変数のクラスが持つメソッドを呼び出した場合、インスタンスのクラスでオーバーライドされていれば、そのオーバーライドしたメソッドが呼び出される。アップキャストが暗黙的に可能なのは、ポリモーフィズムを実現するための言語仕様と考えた方がよい。
これに対し、サブクラスへとキャストすることを「ダウンキャスト」と呼ぶ。不用意なアップキャストは不必要なダウンキャストを強いられることもあり、バグが発生する可能性がある。本当にアップキャストが必要なのか、ポリモーフィズムの観点からも考慮した方が良いだろう。
ちなみに「up」なのは、クラスの継承関係において「スーパークラス」が「サブクラス」の「上」にあるためである。
参考サイト
// Sample.java
public class Sample
{
public static void main( String[] args )
{
// Integerクラスを作ります。
Integer integer = new Integer( 100 );
System.out.println( integer );
// 100
// スーパークラスにあたるObjectクラスに
// 「アップキャスト」します。特に何もせずに
// 自動的にアップキャストされます。
Object object = integer;
System.out.println( object );
// 100
// 重要なのは、たとえアップキャストしても、
// 参照型の型、つまり「入れ物」としての型が
// 変わっただけで、格納されている参照の値や、
// その参照が指し示すインスタンスは全く変化
// しないという点です。これによりポリモーフィズムが
// 実現されます。
System.out.println( object.hashCode() );
// 100
// 見た目はObject#hashCode()メソッドを呼んでいますが、
// 実際に呼ばれているのはIntegerhashCode()メソッドです。
}
}
public class Sample
{
public static void main( String[] args )
{
// Integerクラスを作ります。
Integer integer = new Integer( 100 );
System.out.println( integer );
// 100
// スーパークラスにあたるObjectクラスに
// 「アップキャスト」します。特に何もせずに
// 自動的にアップキャストされます。
Object object = integer;
System.out.println( object );
// 100
// 重要なのは、たとえアップキャストしても、
// 参照型の型、つまり「入れ物」としての型が
// 変わっただけで、格納されている参照の値や、
// その参照が指し示すインスタンスは全く変化
// しないという点です。これによりポリモーフィズムが
// 実現されます。
System.out.println( object.hashCode() );
// 100
// 見た目はObject#hashCode()メソッドを呼んでいますが、
// 実際に呼ばれているのはIntegerhashCode()メソッドです。
}
}
// Sample.java public class Sample { public static void main( String[] args ) { // Integerクラスを作ります。 Integer integer = new Integer( 100 ); System.out.println( integer ); // 100 // スーパークラスにあたるObjectクラスに // 「アップキャスト」します。特に何もせずに // 自動的にアップキャストされます。 Object object = integer; System.out.println( object ); // 100 // 重要なのは、たとえアップキャストしても、 // 参照型の型、つまり「入れ物」としての型が // 変わっただけで、格納されている参照の値や、 // その参照が指し示すインスタンスは全く変化 // しないという点です。これによりポリモーフィズムが // 実現されます。 System.out.println( object.hashCode() ); // 100 // 見た目はObject#hashCode()メソッドを呼んでいますが、 // 実際に呼ばれているのはIntegerhashCode()メソッドです。 } }