gpt4 book ai didi

scala,结构细化中的参数类型

转载 作者:行者123 更新时间:2023-12-01 07:01:59 25 4
gpt4 key购买 nike

当我使用 Scala 2.11.1 和 Akka 2.3.4 编译以下代码时,出现错误:

Error:(24, 35) Parameter type in structural refinement may not refer to an abstract type defined outside that refinement
def behavior(list: List[T], ele: T):Receive={
^
Error:(24, 35) Parameter type in structural refinement may not refer to a type member of that refinement
def behavior(list: List[T], ele: T):Receive={
^

代码:

package exp

import akka.actor.{ActorSystem, Props, Actor}

trait myTrait[T <: myTrait[T]]{
def computeDistance(that: T): Double
}


class otherClass[T <: myTrait[T]](){

def func(data: List[T]):List[String]={

val system = ActorSystem()
system.actorOf(Props(new Actor{
case object START
case class Job(e1: T, e2: T)

def receive = {
case START =>
context become behavior(data.tail, data.head)
}

def behavior(list: List[T], ele: T):Receive={
case _ =>
sender ! Job(list.head, ele)
context become behavior(list.tail, ele)
}
}))
List.empty[String]
}
}

object Test {
class myClass(val x:Double) extends myTrait[myClass]{
override def computeDistance(that: myClass): Double = this.x - that.x
}

def main(args: Array[String]){
val fc = new otherClass[myClass]()
fc.func(List.empty[myClass])
}
}

我将 myTrait 定义为 myTrait[T <: myTrait[T]] 的原因是我希望 myTrait 的子类可以使用子类参数覆盖 computeDistance 方法。按照这个post .

otherClass 提供了一个方法 func 来对 myClass 实例列表进行一些计算。 (实际上上面的代码是我需要的抽象。)

在行为上添加泛型可以消除上述错误,但会导致新的错误。

def behavior[S](list: List[T], ele: S):Receive={
case _ =>
sender ! Job(list.head, ele)
context become behavior(list.tail, ele)
}

然后,在Job(list.head, ele)中,S类型的ele与T类型不匹配。

如何解决这个问题?

最佳答案

添加类型注释以将类型扩展为普通 Actor 解决了这个问题:

system.actorOf(Props(new Actor{
// ...
}: Actor))

关于scala,结构细化中的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25518226/

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