没有可用于 A 的 ClassTag - 但存在隐式参数
No ClassTag available for A - but implicit parameter present
使用 scala 2.12.4 我无法使用此代码,因为它说
[error] .../src/main/scala/effect.scala:32:11: No ClassTag available for A
[error] Effect(effectDefinition)
[error] ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
这是(简化的)代码。我需要 class 标签的原因是稍后在代码 (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
很糟糕?我无法绕过那个演员表
你有以下方法:
def translate[A <: EffectBearing[A]](effectDefinition: EffectDefinition[A]): Effect[A] =
Effect(effectDefinition)
Effect
构造函数需要一个隐式的 ClassTag[A]
但这里 A
是一个类型参数,因此编译器不知道它是哪个具体的 class 。并且 translate
中的 A
上没有 ClassTag
上下文绑定,因此编译器将无法找到隐式的 ClassTag[A]
.
使用 scala 2.12.4 我无法使用此代码,因为它说
[error] .../src/main/scala/effect.scala:32:11: No ClassTag available for A
[error] Effect(effectDefinition)
[error] ^
[error] one error found
[error] (compile:compileIncremental) Compilation failed
这是(简化的)代码。我需要 class 标签的原因是稍后在代码 (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
很糟糕?我无法绕过那个演员表
你有以下方法:
def translate[A <: EffectBearing[A]](effectDefinition: EffectDefinition[A]): Effect[A] =
Effect(effectDefinition)
Effect
构造函数需要一个隐式的 ClassTag[A]
但这里 A
是一个类型参数,因此编译器不知道它是哪个具体的 class 。并且 translate
中的 A
上没有 ClassTag
上下文绑定,因此编译器将无法找到隐式的 ClassTag[A]
.