Невозможно решить, отменить - PullRequest
0 голосов
/ 09 мая 2019
object micro extends App {

  sealed trait FuncExpr

  sealed trait FuncSpecialize

  sealed case class Func(i:Int) extends FuncExpr
  sealed case class Cube(b:Boolean) extends FuncSpecialize

  object Cube {
    def unapply(arg:Func) : Option[Boolean] = arg match {
      case Func(i) if i == 42 => Some(true)
      case _ => None
    }
  }

  val x : FuncSpecialize = Cube(true)
  x match {
    case Cube(b) => println("Success")
  }
}

Это свернутый пример, в котором я пытаюсь реализовать пользовательский метод unapply для класса case Cube вместе с методом unapply по умолчанию. Однако, если попытаться сопоставить шаблон с x, я получу следующее сообщение об ошибке, которое я не ожидал бы, потому что Func и FuncSpezialize - совершенно разные типы:

Error:(19, 10) cannot resolve overloaded unapply
    case Cube(b) => println("Success")
Error:(19, 10) overloaded method value unapply with alternatives:
  (x$0: micro.Cube)Option[Boolean] <and>
  (arg: micro.Func)Option[Boolean]
 cannot be applied to (micro.FuncSpecialize)
    case Cube(b) => println("Success") 

Есть идеи, почему это так?

1 Ответ

1 голос
/ 09 мая 2019

Поскольку Cube является классом case, компилятор сгенерировал для него unapply

  object Cube {
    // auto-generated
    def unapply(arg: Cube): Option[Boolean] = Some(arg.b)

    // custom
    def unapply(arg:Func) : Option[Boolean] = arg match {
      case Func(i) if i == 42 => Some(true)
      case _ => None
    }
  }

Теперь, когда вы пытаетесь сопоставить шаблон

  val x : FuncSpecialize = Cube(true)
  x match {
    case Cube(b) => println("Success")
  }

, это фактически вызов Cube.unapply(x).Вы не можете применить любой из unapply методов к x типа FuncSpecialize.

...