如下所示,我定义了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的成员
答案 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