我想要一个具有静态可用功能(由特征收缩)的类。然后我想要一个类型参数化方法,它采用这种类型作为其类型参数并访问收缩的静态函数。 (是的,我知道术语静态是Java而不是Scala,但你知道我的意思。)
我知道在Scala中使用静态函数的唯一方法是让伴随对象扩展特征。然而,这样做有两个问题:
这可能完全没有了,但有点我想做的是:
MyTrait {
def MyFunction() : Any //some function
}
case class MyClass(i: Int)
object MyClass extends MyTrait {
def MyFunction() = {/*do stuff*/}
}
//need the type as a class not an object because I need it for a higher order function like this
def SomeFunctionHigherOrderFunction[T /*constrain T such that the companion object of T <: MyTrait*/](someFunc : Function1[T, Any]) : Unit {
val someStuff = T.MyFunction()
/*use someStuff in here*/
}
SomeFunctionHigherOrderFunction[T](/*provide a Function1[T, Any]*/);
正确解决方案的任何想法或一些更好的方法来解决这个问题?
提前致谢!
答案 0 :(得分:1)
没有办法做到这一点。您可以采用的一种方法是将方法传递给via implicits(这也称为类型类方法)。您需要在T
上对特征进行参数化(即使您不使用它,T
也会用于向右解析)。
trait MyTrait[T] {
def MyFunction() : Any //some function (usually you want to use `T` somehow)
}
然后,您声明您的伴侣对象是隐式的。像这样的东西
implicit object MyClass extends MyTrait[MyClass] {
def MyFunction = ...
}
或者,如果您在该对象中没有任何其他内容,您甚至可以直接进行内联:
implicit val myTraitMyClass: MyTrait[MyClass] = new MyTrait[MyClass] {
def MyFunction = ...
}
通过
使用它def SomeHigherOrderFunction[T](someFunc : Function1[T, Any])(implicit o: MyTrait[T]): Unit {
val someStuff = o.MyFunction()
/*use someStuff in here*/
}