考虑下面这段代码:
case class User(id: Int, name: String)
object User{
def unapply(str: String) = Some(User(0, str))
}Scala报告“错误:无法解决重载的unapply;case class User(id: Int,str: String)”不能重载unapply吗?
更新:取消应用较大的元组大小。
case class User(id: Int, str: String)
object User{
def unapply(s: String) = Some((User(0, s), s, 1234))
}编译器仍然报告“无法解决重载的未应用”
发布于 2011-10-25 15:00:00
您的unapply方法无法用于模式匹配
它可以与
def unapply(arg: <type to match>) : Option[(<matched fields types>)](如果只有一个字段,则没有元组;如果没有字段,则为布尔值而不是Option )。
用户不适用的标准是( Scala语言规范,第67页)
def unapply(u: User) =
if (u eq null) None
else Some((u.id, u.name))如果您想要匹配一个id为零的用户,如下所示
user match {case User(name) => ....}那将是
def unapply(u: User): Option[String] =
if(u eq null || u.id != 0) None
else Some(u.name)如果您希望字符串可以作为用户匹配(这将是相当奇怪的)
def unapply(s: String): Option[User] = Some(User(0, s))它将与
"john" match case User(u) => ... // u is User(0, john)我猜你想要前一个。在这种情况下,您的应用程序和标准方法都是具有相同参数列表(一个用户参数)的两个方法,因此它们不兼容。这可能被视为有点不幸,因为当方法作为提取器被调用时,区别元素实际上是结果元组的大小,而不是参数的类型。
然而,您的方法虽然不是有效的提取器,但不会导致冲突。我在说明书中找不到禁止它的东西。尽管如此,它仍然是无用的,一个有用的方法理所当然不会被允许。
发布于 2015-08-25 00:21:35
不能覆盖unapply的原因(特别是)很可能是因为它与case类的扩展对象自动创建的unapply具有相同的符号。请记住,函数的符号不会考虑其重写的返回值。
https://stackoverflow.com/questions/7885151
复制相似问题