Javaの参照型の変数を型変換するサンプルです。
変換する型同士がクラスの継承またはインターフェースの実装の関係である必要があります。
目次
親クラスの型への代入

親クラスの型の変数への代入は、暗黙的に型変換が行われるのでそのまま代入できます。
子クラスは親クラスのすべてのメンバーを保証できるためです。
コード
親クラスの型への代入のサンプルです。
package test1;
class TestA {
void printA() { }
}
class TestB extends TestA {
void printB() { }
}
public class Test1 {
public static void main(String[] args) {
TestB tb = new TestB();
TestA ta = tb;
ta.printA();
// ta.printB(); //コンパイルエラー
}
}
7行目のクラスは3行目のクラスを継承しています。
14行目は、子クラスのインスタンスを生成しています。
16行目は、親クラスの型の変数に代入しています。キャストなしで実行できます。
17行目は、親クラスのメソッドを実行しています。
18行目は、子クラスのメソッドを実行しようとしていますがコンパイルエラーになります。
変数の型で実行できるメソッドが制限されています。
→継承でメソッド名が同じオーバーライドの場合は、インスタンスの型のほうで実行されます。Java オーバーライドのサンプル
子クラスの型への代入

子クラスの型の変数への代入は、明示的にダウンキャストを行う必要があります。
親クラスは子クラスのすべてのメンバーを保証できないためです。
コード
子クラスの型への代入のサンプルです。
package test1;
class TestA {
void printA() { }
}
class TestB extends TestA {
void printB() { }
}
public class Test1 {
public static void main(String[] args) {
TestA ta = new TestB();
TestB tb = (TestB)ta;
tb.printA();
tb.printB();
}
}
7行目のクラスは3行目のクラスを継承しています。
14行目は、子クラスのインスタンスを生成して親クラスのデータ型に代入しています。
16行目は、子クラスの型の変数にダウンキャストを行って代入しています。ダウンキャストしない場合コンパイルエラーになります。キャストは、データ型をかっこで括ります。
17行目は、親クラスのメソッドを実行しています。
18行目は、子クラスのメソッドを実行しています。
インターフェースの型への代入

インターフェースの型の変数への代入は、暗黙的に型変換が行われるのでそのまま代入できます。
インターフェースを実装しているクラスはインターフェースのすべてのメンバーを保証できるためです。
コード
インターフェースの型の変数への代入のサンプルです。
package test1;
interface InterfaceA {
void printA();
}
class TestB implements InterfaceA {
public void printA() { }
public void printB() { }
}
public class Test1 {
public static void main(String[] args) {
TestB tb = new TestB();
InterfaceA ia = tb;
ia.printA();
// ia.printB(); //コンパイルエラー
}
}
7行目のクラスは3行目のインターフェースを実装しています。
15行目は、インスタンスを生成しています。
17行目は、インターフェース型の変数に代入しています。キャストなしで実行できます。
18行目は、インターフェースとクラスにあるメソッドを実行しています。
19行目は、クラスのみにあるメソッドを実行しようとしていますがコンパイルエラーになります。
変数の型で実行できるメソッドが制限されています。
関連の記事
Java 変数のデータ型とラッパークラスとボクシング変換
Java クラスの変数の用語のサンプルとまとめ(メンバー変数他)