【发布时间】:2020-04-01 12:11:55
【问题描述】:
我正在尝试创建 Workflow Builder - 我的问题的简化版本如下所示。 Scala 编译器似乎无法在 BuilderExtensions 中填充类型参数。 我试图让编译器通过实现 ProducedComponent 实现 Produce[Y] 来推断 Y。 我得到的唯一解决方案要求您明确指定 Y。 我曾尝试阅读有关类型类等的内容,但我并不精通这类理论。有人能帮忙吗?它让我省心。
abstract class Component {}
trait Produce[+A <: Component] {
def produce: A
}
case class ProducedComponent() extends Component
case class ProducerComponent()
extends Component
with Produce[ProducedComponent] {
override def produce: ProducedComponent = ProducedComponent()
}
case class Builder[Result <: Component](w: Result) {}
object Extensions {
implicit class BuilderExtension[Y <: Component,X <: Component with Produce[Y]](
w: Builder[X]
) {
def thenProduce(): Builder[Y] = {
Builder(w.w.produce)
}
}
}
import Extensions._
val x = Builder(
ProducerComponent()
)
import scala.reflect.runtime.universe
import universe.WeakTypeTag
def getType[A: WeakTypeTag](x: A) = universe.weakTypeOf[A]
getType(x)
// Does not Compile
val y = x.thenProduce()
getType(y)
【问题讨论】:
-
不推荐运行时反射
-
运行时反射仅用于检查。我希望在编译时检查类型。
标签: scala generics type-inference