gpt4 book ai didi

伴随类型的 Scala 类型约束

转载 作者:行者123 更新时间:2023-12-04 22:40:21 26 4
gpt4 key购买 nike

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

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

  1. 我不知道如何约束类型参数,使其伴随对象扩展某些特征。
  2. 我不知道如何访问静态方法,因为该类实际上是与其伴随对象不同的类型。

这可能完全关闭,但我想做的是:

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

关于正确解决方案或解决此问题的更好方法的任何想法?

提前致谢!

最佳答案

没有办法做到这一点。您可以采用的一种方法是通过隐式传递方法(这也称为类型类方法)。您需要通过 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*/
}

关于伴随类型的 Scala 类型约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39260122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com