【问题标题】:Type Inference for a mixed in generic trait混合通用特征的类型推断
【发布时间】: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


【解决方案1】:

尝试修改BuilderExtension

implicit class BuilderExtension[X <: Component](
  w: Builder[X]
) {
  def thenProduce[Y <: Component]()(implicit ev: X <:< Produce[Y]): Builder[Y] = {
    Builder(w.w.produce)
  }
}

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多