次のコードサンプルのように、メソッドが1回だけ呼び出されるように、タイプセーフビルダーパターンでファントムタイプを使用しています。
sealed trait TBoolean
sealed trait TTrue extends TBoolean
sealed trait TFalse extends TBoolean
class Builder[MethodCalled <: TBoolean] private() {
def foo()(implicit ev: MethodCalled =:= TFalse): Builder[TTrue] = {
new Builder[TTrue]
}
}
object Builder {
def apply() = new Builder[TFalse]()
}
Builder().foo().foo()
必要に応じて動作しませんが、エラーメッセージをユーザーが読みやすいものに設定したいと思います。現時点でのメッセージは
この行に複数のマーカー-メソッドfooの引数が不十分です:(暗黙のev:=:= [W.TTrue、W.TFalse])W.Builder[W.TTrue]。不特定の値パラメータev。-W.TTrue =:=W.TFalseであることを証明できません。-W.TTrue =:=W.TFalseであることを証明できません。