【Java8】メソッド参照は型安全を壊してる?
まぁなぁ。ラムダ式はクラス名やメソッド名の縛りをぶっ壊してるから、型安全的に作りたいときは微妙なんだよなぁ。
— なおしむ (@naosim_) 2016, 2月 16
こんなことをつぶやいたら
わりと盛り上がったのでメモ。
例えばこんなコードがあったとすると
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つだけ持つインターフェースは型安全な実装ができない
てことになる。
なんだかなー。