gpt4 book ai didi

scala - 如何在 Scala 中实例化由类型参数表示的类型实例

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

例子:

import scala.actors._  
import Actor._

class BalanceActor[T <: Actor] extends Actor {
val workers: Int = 10

private lazy val actors = new Array[T](workers)

override def start() = {
for (i <- 0 to (workers - 1)) {
// error below: classtype required but T found
actors(i) = new T
actors(i).start
}
super.start()
}
// error below: method mailboxSize cannot be accessed in T
def workerMailboxSizes: List[Int] = (actors map (_.mailboxSize)).toList
.
.
.

请注意,第二个错误表明它知道参与者项是“T”,但不知道“T”是参与者的子类,如类泛型定义中的约束。

如何更正此代码以使其正常工作(使用 Scala 2.8)?

最佳答案

编辑 - 抱歉,我只注意到你的第一个错误。没有办法实例化 T在运行时,因为编译程序时类型信息丢失(通过类型 删除 )

您必须通过一些工厂才能实现构建:

class BalanceActor[T <: Actor](val fac: () => T) extends Actor {
val workers: Int = 10

private lazy val actors = new Array[T](workers)

override def start() = {
for (i <- 0 to (workers - 1)) {
actors(i) = fac() //use the factory method to instantiate a T
actors(i).start
}
super.start()
}
}

这可能会与某些 Actor 一起使用 CalcActor如下:
val ba = new BalanceActor[CalcActor]( { () => new CalcActor } )
ba.start

顺便说一句:您可以使用 until而不是 to :
val size = 10
0 until size //is equivalent to:
0 to (size -1)

关于scala - 如何在 Scala 中实例化由类型参数表示的类型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1305563/

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