我知道我可以将一个伴侣对象添加到静态def / val的类中,但我的问题是我希望它能够确定一个特性。我想要访问这个静态val或def作为抽象类型(根据java static预期的行为使用static here) 考虑一下这段代码
wget "http://bitbucket.org/eigen/eigen/get/3.2.8.tar.gz"
tar zxvf 3.2.8.tar.gz
cd eigen*
/eigen-eigen-07105f7124f9$ mkdir build
/eigen-eigen-07105f7124f9$ cd build
/eigen-eigen-07105f7124f9/build$ cmake ..
/eigen-eigen-07105f7124f9/build$ make
/eigen-eigen-07105f7124f9/build$ sudo make install
我希望能够在没有M实例的情况下将M.description作为静态方法调用。我的用例是我有一个M对象的spark数据集,我希望看到M的描述属性而不获取记录从数据集中,因为这将导致火花动作/作业 我可以使用scala模式吗?谢谢
答案 0 :(得分:2)
只需为M
创建一个伴随对象,它定义静态值,然后在案例类中引用它
object M {
val description = "I'm M"
}
case class M extends A with B {
override def description = M.description
}
或假设子类型之间存在共性
trait Description {
val title: String
val description = s"I'm ${title}"
}
object M extends Description {
val title = "M"
}
object N extends Description {
val title = "N"
}
case class M() extends A with B {
override def description = M.description
}
case class N() extends A with B {
override def description = N.description
}
答案 1 :(得分:0)
您可以将B
的描述重构为另一个特征,如:
trait BInfo {
def description: String
}
trait B extends BInfo {
def bBehavior(): Unit
def bInfo: BInfo
final override def description = bInfo.description
}
case class M() extends A with B {
override def aBehavior() = print("A behavior of M")
override def bBehavior() = print("B behavior of M")
override def bInfo = M
}
object M extends BInfo {
override def description = "I'm M"
}
val m = M()
M.description // I'm M
m.description // I'm M