【Java8】メソッド参照は型安全を壊してる?


こんなことをつぶやいたら
わりと盛り上がったのでメモ。

例えばこんなコードがあったとすると

interface StudyAction {
    void study();
}

interface PlayAction {
    void play();
}

static class Mama {
    static void force(StudyAction studyAction) {
        studyAction.study();// 勉強しろや!
    }
}

static class Son implements PlayAction {
    @Override
    public void play() {
        System.out.print("ひゃっほーい");
    }
}

static void main() {
    Son son = new Son();
    Mama.force(son::play);// !!!
}

これはビルドが通ります。

でね。
ママは
引数で与えられたstudyメソッドを持つオブジェクトに対して
「勉強しろや!」って命令します。
なのにメイン関数を見ると
このママに「ひゃっほーい」って遊ぶことしか出来ないplayを渡せてしまう。。

コレって気持ち悪くね?
型安全じゃなくね?

なので結論的には
メソッドを1つだけ持つインターフェースは型安全な実装ができない
てことになる。
なんだかなー。