scala:class不能从外部访问伴随对象成员

时间:2018-01-17 09:18:27

标签: 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
    *
    * @param other
    * @param weight
    * @return
    */
  def +*(other: MapModel, weight: Double): MapModel = {
    ???
  }
  def test(): Unit ={

  }
}

我想创建一个MapModel实例并调用+ *方法。但是,无法找到伴随对象中的所有方法。 例如,我有一个jm实例,它是Map[String,Double]

MapModel(jm).test()

产生错误,说

  

value test不是MapModel的成员

3 个答案:

答案 0 :(得分:1)

在类/ trait的伴随对象上定义的方法在该类型的任何实例上都不可见,但只能通过在伴侣本身上显式调用方法来实现。

您似乎正在寻找像语法一样的扩展方法。您可以通过<img src="{{ public_path('images/image.jpg') }}" />

执行此操作
implicit class

现在这有效:

implicit class MapModelOps(val mapModel: MapModel) extends AnyVal {
  def +*(other: MapModel, weight: Double): MapModel = {
    ???
  }
}

或者,如果您有权访问基础类,则可以将方法放在其中。

答案 1 :(得分:1)

对象MapModel没有类型MapModel.type(令人困惑的是,它的类型为MapModel)。

如果要向+*添加方法,则需要将它们添加到类中。例如,您的class MapModel(val map: Map[String, Double]) { def +*(other: MapModel, weight: Double): MapModel = new MapModel(map ++ other) } 方法在随播对象中没有任何意义:

For loopi = maxlastrow + 3 To lastrowrangetotal
issuerformula = Cells(loopi, 4).Address(rowabsolute:=False, columnabsolute:=False)
Worksheets("Dashboard").Cells(loopi, 4).Formula = "=BDP(""&issuerformula.value&"",""ISSUER"")"
Next loopi

答案 2 :(得分:0)

有时,使用类实例授予对所有伴随对象成员的访问权限可能会很有用。可以使用以下隐式转换来实现:

implicit def mapModelAcessCompanion(m: MapModel): MapModel.type = MapModel