伴随类型的Scala类型约束

时间:2016-08-31 22:42:21

标签: scala

我想要一个具有静态可用功能(由特征收缩)的类。然后我想要一个类型参数化方法,它采用这种类型作为其类型参数并访问收缩的静态函数。 (是的,我知道术语静态是Java而不是Scala,但你知道我的意思。)

我知道在Scala中使用静态函数的唯一方法是让伴随对象扩展特征。然而,这样做有两个问题:

  1. 我不知道如何约束类型参数,使得它的伴随对象扩展了一些特征。
  2. 我不知道如何访问静态方法,因为该类实际上与其伴随对象的类型不同。
  3. 这可能完全没有了,但有点我想做的是:

    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]*/);
    

    正确解决方案的任何想法或一些更好的方法来解决这个问题?

    提前致谢!

1 个答案:

答案 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*/
}