Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala:类可以';t从外部访问同伴对象成员_Scala - Fatal编程技术网

scala:类可以';t从外部访问同伴对象成员

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

如下所示,我定义了一个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
    *
    * @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这就是为什么我在底部评论说这取决于他。在我看来,这是一个风格问题,取决于你想怎么做,两种方式都可以。