0

使用 scala 2.12.4 我无法让这段代码工作,因为它说

[错误] .../src/main/scala/effect.scala:32:11:A 没有可用的 ClassTag

[错误] 效果(效果定义)

[错误] ^

[错误] 发现一个错误

[错误] (compile:compileIncremental) 编译失败

这是(简化的)代码。我需要类标签的原因是稍后在代码中进行过滤(installEffect)。

import scala.reflect.ClassTag

package object effect {

  type EffectDefinition[A <: EffectBearing[A]] = A => Unit

  case class Effect[A <: EffectBearing[A]](fx: A => Unit)(implicit tag: ClassTag[A]) {
    def effectedType: Class[A] = tag.runtimeClass.asInstanceOf
  }

  trait EffectBearing[This <: EffectBearing[This]] {
    def installEffect(effect: Effect[This]): Unit = {
      effect.fx(this.asInstanceOf[This])
    }
  }

  trait EffectPropagating {

    def installEffect[T<: EffectBearing[T]](effect: Effect[T], typ: Class[T]): Unit =
      find(typ).foreach(_.installEffect(effect))

    protected def find[T <: EffectBearing[T]](typ: Class[T]): Set[T]
  }

  class Foo extends EffectBearing[Foo] {}

  val fxFoo: EffectDefinition[Foo] = print(_)

  def translate[A <: EffectBearing[A]](effectDefinition: EffectDefinition[A]): Effect[A] =
    Effect(effectDefinition)

  val fx = translate(fxFoo)

}

ps:是用法

tag.runtimeClass.asInstanceOf

很坏?我无法绕过那个演员

4

1 回答 1

4

您有以下方法:

def translate[A <: EffectBearing[A]](effectDefinition: EffectDefinition[A]): Effect[A] =
  Effect(effectDefinition)

构造Effect函数需要一个隐式参数,ClassTag[A]但这里A是一个类型参数,因此编译器不知道它将是哪个具体类。并且in没有ClassTag上下文绑定,因此编译器将无法找到隐含的.AtranslateClassTag[A]

于 2017-11-19T17:11:29.883 回答