scala:类可以';t从外部访问同伴对象成员
如下所示,我定义了一个MapModel类及其伴生对象scala:类可以';t从外部访问同伴对象成员,scala,Scala,如下所示,我定义了一个MapModel类及其伴生对象 class MapModel(val map: Map[String, Double]) object MapModel { implicit def MapToMapModel(map: Map[String, Double]) = new MapModel(map) def apply(map: Map[String, Double]) = new MapModel(map) /** * weighted sum
class MapModel(val map: Map[String, Double])
object MapModel {
implicit def MapToMapModel(map: Map[String, Double]) = new MapModel(map)
def apply(map: Map[String, Double]) = new MapModel(map)
/**
* weighted sum
*
* @param other
* @param weight
* @return
*/
def +*(other: MapModel, weight: Double): MapModel = {
???
}
def test(): Unit ={
}
}
我想创建一个MapModel实例并调用+*方法。但是,无法找到伴生对象中的所有方法。
例如,我有一个jm
实例,它是一个映射[String,Double]
MapModel(jm).test()
产生错误,说
值测试不是MapModel的成员
在类/特征的伴生对象上定义的方法在该类型的任何实例上都不可见,而只能通过在伴生对象本身上显式调用方法 看起来您正在寻找一种类似语法的扩展方法。您可以通过
隐式类执行此操作:
implicit class MapModelOps(val mapModel: MapModel) extends AnyVal {
def +*(other: MapModel, weight: Double): MapModel = {
???
}
}
现在,这是可行的:
def main(args: Array[String]): Unit = {
val map = MapModel(Map("s" -> 1.0))
val res = map +* (MapModel(Map("v" -> 2.0)), 3.0)
}
或者,如果您有权访问基础类,您可以将方法放在其中。对象MapModel
没有类型MapModel
(令人困惑的是,它有类型MapModel.type
)
如果要将方法添加到MapModel
,则需要将它们添加到类中。例如,您的+*
方法在伴随对象中没有什么意义:
class MapModel(val map: Map[String, Double]) {
def +*(other: MapModel, weight: Double): MapModel = new MapModel(map ++ other)
}
有时,使用类实例授予对所有伴生对象成员的访问权是很有用的。可通过以下隐式转换实现:
implicit def mapModelAcessCompanion(m: MapModel): MapModel.type = MapModel
应该直接访问伴生对象的成员,如MapModel.test()
,因此伴生对象不是类的实例?伴生对象是类的单实例MapModel(jm)
调用伴随对象的apply()
方法,在本例中,该方法是一个工厂方法,返回MapModel
的实例。因为test()
是对象上的一个方法,而不是类,所以不能在工厂方法的返回值上调用它。Yuval,如果Tyler控制伴生对象,这意味着他也控制主类。在这种情况下,为什么+*
应该作为一种扩展方法来实现,而不是像Nicolas那样在MapModel
内部实现?@SergGr这就是为什么我在底部评论说这取决于他。在我看来,这是一个风格问题,取决于你想怎么做,两种方式都可以。