インタフェース型の暗黙的なメンバ
インタフェース型のメンバには,Objectクラスのすべてのメソッドと同じシグネチャを持つ,public abstractを指定したインスタンスメソッドが暗黙的に宣言される.
だから,
public class Test { public static final void main(String[] args){ List l = new ArrayList(); //コンパイルエラーには,ならない. String hoge = ((Hogerable)(l)).toString() ; System.out.println(hoge + " End."); } } interface Hogerable { }
HogerableにキャストされたlがtoString()メソッドを持てるのは,この理由である*1とか.ただし,この場合実行時にクラスキャスト例外が生じる.もちろん,HogerableとListを実装するクラスを,lに代入していたら,何の問題もなくプログラムは終了する. 言われてみると ,普通に使っている気がするな.
List l = new ArrayList(); l.toString()
とかで,Listインタフェースには,どこにもtoString()メソッドなんていうメンバはないし,Listのスーパーインタフェースでも同様.であるのに,こういうメソッド呼び出しがコンパイル通るのは,この理由だったか
っていうか,Hogerableって語呂が気に入ったが使っている人は少ないようだ.
*1:つまり,Listクラスのメソッドであるadd(object)とかは持てない