在 Scala 中,可以使用隐式类向对象添加新方法:
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")
或类似的东西。
一般来说答案是否定的。若要将构造函数或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")