Java研修中に起こったエラーについての覚え書き。
#コードおよびコンパイルエラー
Sample.java
abstract class A{
abstract void aMethod();
}
interface B{
void bMethod();
}
//A継承
class OnlyA extends A{
public void aMethod(){};
}
//A継承・B実装
class AB extends A implements B{
public void aMethod(){};
public void bMethod(){};
}
public class Main {
public static void main(String[] args){
A[] a = new A[]{new OnlyA(), new AB()};
//抽象クラスメソッド呼び出し
a[0].aMethod();
a[1].aMethod();
//インターフェースメソッド呼び出し
a[1].bMethod();
}
}
/*
Main.java:26: error: cannot find symbol
a[1].bMethod();
^
symbol: method bMethod()
location: class A
*/
呼び出せませんでした。
#解決法
Main.java
public class Main {
public static void main(String[] args){
A var1 = new AB();
B var2 = new AB();
AB var3 = new AB();
var1.bMethod(); //これはダメ
var2.bMethod(); //これはオッケー
var3.bMethod(); //これもオッケー
}
}
この場合、インターフェース型で宣言するかそれを実装した型で宣言しないとダメみたいですね。
インスタンスclass AB extends A implements B
のメソッドに直接アクセスしてるもんだと思ってたけどclass A
で宣言してるからまずそっちにアクセスしてるのかな?
継承だけ・実装だけの場合、親子両方定義するのでcannot find symbol
が出ることはまあないんですが、このように継承と実装を同時に行うと注意しないといけないですね。
(あまりインターフェースを使ったことがないのがバレる形になった)
もっと勉強が必要と感じた次第です。