キャストに関して素人丸出しの勘違いをしていた件
仕事でJavaを扱っていた際、キャストの考え方に関して大いに勘違いをしていたことに気付いた。
以下、現象を説明する適当なコード。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
class A { // 何もしない } class B extends A { private String strB; public String getString(){ return strB; } public void setString( String strB ){ this.strB = strB; } } public class MainClass { public static void main( String[] args ) { B clsB = new B(); // Bに適当な値をセット clsB.setString( "仕事辞めたい" ); // メソッド呼び出し caster( clsB ); } private static void caster( A clsA ) { String strMain; // ここでエラー strMain = (B)clsA.getString(); // 取得した値を出力 System.out.println( strMain ); } } 出力結果 C:\practice\java\practice>javac MainClass.java MainClass.java:34: シンボルを解決できません。 シンボル: メソッド getString () 場所 : A の クラス strMain = (B)clsA.getString(); ^ MainClass.java:34: 互換性のない型 検出値 : B 期待値 : java.lang.String strMain = (B)clsA.getString(); ^ エラー 2 個
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
呼び出し元からの引数が親クラスの型で送られてきているが、使用したいメソッドは子クラスの中で設定されているため、キャストを行う必要がある、という場合。
strMain = (B)clsA.getString();
動作のイメージとしては、clsAをB型にキャストし、変換された後の型でgetString()を呼び出し、その値をstrMainに対して引き渡す――という流れにしたつもりだったのだけど。
解答を探して手元のC++の本(なぜJavaじゃないんだ?)のキャストの項を見てみると、この括弧は通常の演算子ではなく、キャスト演算子であることを示すためのものである、との記述があった。というわけで、
strMain = ((B)clsA).getString();
こうすると無事コンパイルが通った。
わかってみれば、何ともしょぼい所で躓いていたのだなあ、という気がしてくる。
普段から趣味やら何やらでコーディングをやっている人なら、多分こういうミスは起こさないのだろう。経験不足が身に沁みる。