在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")
还是类似的东西。
答案 0 :(得分:3)
通常答案是否定的。要添加构造函数或apply
到TargetClass
方法,您应该控制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")