我正在尝试实现一个结果缓存(Loader
类),它将类的可散列实例映射Resolver[T]
到Result
实例,其中T
is 的类型为Result
. 当然,用户可以专门化Result
提供特定于应用程序的额外方法的类。关键是使用该Loader.get
方法用户还必须指定结果类型:
val s = Loader.get(new SpecializedResolver()).asInstanceOf[SpecializedResult]
我想要的是避免强制转换并使其隐式,所以代码应该是这样的:
val implicitS = Loader.get(new SpecializedResolver())
我目前拥有的代码如下:
import scala.language.existentials
abstract class Result {
def computed: Boolean
}
abstract class Resolver[T <: Result] {
def result(): T forSome {type T <: Result}
}
class SpecializedResult extends Result {
def computed = true
def special() = 42
}
class SpecializedResolver extends Resolver[SpecializedResult] {
def result = new SpecializedResult
}
object Loader {
val cache = collection.mutable.Map[K forSome {type K <: Resolver[_]}, V forSome {type V <: Result}]()
def get[K <: Resolver[_]](k: K): V forSome {type V <: Result} = {
cache.getOrElseUpdate(k, { k.result } )
}
}
object Runner {
def main(args: Array[String]) {
val s = Loader.get(new SpecializedResolver()).asInstanceOf[SpecializedResult]
println("Value is: %d".format(s.special))
val implicitS = Loader.get(new SpecializedResolver())
// test.scala:34: error: value special is not a member of Result
println("Value is: %d".format(implicitS.special))
}
}
由于我对 scala 语言比较陌生,我的问题是:是否有可能通过使用 scala 提供的高级类型功能来实现这种隐式转换?我看了一下演讲“Scala Land of the Land of High Wizardry”,演讲者 Daniel Spiewak 介绍了一个执行类似操作的高阶HOMap
,但我仍然不太了解如何使他的解决方案适应我的情况。