我可以在现有类中添加新构造函数吗?

时间:2018-01-17 17:00:19

标签: scala constructor extension-methods implicit

在Scala中,可以使用implicit class向对象添加新方法:

implicit class IntWithTimes(x: Int) {
  def times[A](f: => A): Unit = {
    def loop(current: Int): Unit =
      if(current > 0) {
        f
        loop(current - 1)
      }
    loop(x)
  }
}

是否有添加新构造函数的机制?是new Int("1")还是Int("1")还是类似的东西。

1 个答案:

答案 0 :(得分:3)

通常答案是否定的。要添加构造函数或applyTargetClass方法,您应该控制class TargetClass或其伴随object TargetClass的来源,这两者都必须在同一个档案中。

如果您的目标实际上是Int,那么可以使其与以下黑客一起使用:

object IntEx {
  def Int(s: String): Int = s.toInt
}

import IntEx._

val v: Int = Int("123")

此hack仅适用于Int没有配套对象,因此Int已解析为IntEx.Int方法。它不适用于任何具有已定义的伴随对象的类,包括任何case class,因为它将优先于名称解析。

仍然最重要的问题可能是您希望它看起来像构造函数而不是显式工厂方法?我的意思是

真正的错误
object IntEx {
  def intFromString(s: String): Int = s.toInt
}
val v2: Int = IntEx.intFromString("123")

object IntFromString {
  def apply(s: String): Int = s.toInt
}
val v3: Int = IntFromString("123")