Scala:参数的类型注释将 ClassTag 重置为 Option 并破坏类型匹配
Scala: Type annotation of parameter resets ClassTag to Option and spoils type matching
我有一个带有类型参数的特征。在这个特征中,我想定义一个方法来检查对象是否与类型参数匹配。到目前为止,这是有效的,正如我希望的那样:
import scala.reflect.ClassTag
trait MyTrait[A <: AnyVal]{
def hasType(x: AnyVal)(implicit tag: ClassTag[A]) = x match {
case _: A => true
case _ => false
}
}
object MyObject extends MyTrait[Int]
println(MyObject.hasType(5)) // returns true
println(MyObject.hasType(5.0)) // returns false
当 MyTrait
对象是 class 的参数时会出现问题,如下所示:
class WrappingClass(myObjects: Seq[MyTrait[_]]) {
def hasType(x: AnyVal) = {
myObjects.foreach(
mo => println(mo.hasType(x))
)
}
}
object AnotherObject extends MyTrait[Double]
val wrappingObject = new WrappingClass(Seq(MyObject, AnotherObject))
wrappingObject.hasType(5) // prints only "true"
wrappingObject.hasType(5.0) // prints only "true"
所以基本上参数的类型注释 Seq[MyTrait[_]]
将我的 ClassTag 变成了一般对象并破坏了类型匹配。我真的很想避免在每个继承自特征的对象中编写 hasType
方法。
您需要将 class 与 ClassTag
上下文绑定一起使用(因为这些绑定在特征中不可使用)。
如果将 MyTrait
替换为:
abstract class MyTrait[A <: AnyVal: ClassTag] {
def hasType(x: AnyVal) = x match {
case _: A => true
case _ => false
}
}
它将如您所愿
我有一个带有类型参数的特征。在这个特征中,我想定义一个方法来检查对象是否与类型参数匹配。到目前为止,这是有效的,正如我希望的那样:
import scala.reflect.ClassTag
trait MyTrait[A <: AnyVal]{
def hasType(x: AnyVal)(implicit tag: ClassTag[A]) = x match {
case _: A => true
case _ => false
}
}
object MyObject extends MyTrait[Int]
println(MyObject.hasType(5)) // returns true
println(MyObject.hasType(5.0)) // returns false
当 MyTrait
对象是 class 的参数时会出现问题,如下所示:
class WrappingClass(myObjects: Seq[MyTrait[_]]) {
def hasType(x: AnyVal) = {
myObjects.foreach(
mo => println(mo.hasType(x))
)
}
}
object AnotherObject extends MyTrait[Double]
val wrappingObject = new WrappingClass(Seq(MyObject, AnotherObject))
wrappingObject.hasType(5) // prints only "true"
wrappingObject.hasType(5.0) // prints only "true"
所以基本上参数的类型注释 Seq[MyTrait[_]]
将我的 ClassTag 变成了一般对象并破坏了类型匹配。我真的很想避免在每个继承自特征的对象中编写 hasType
方法。
您需要将 class 与 ClassTag
上下文绑定一起使用(因为这些绑定在特征中不可使用)。
如果将 MyTrait
替换为:
abstract class MyTrait[A <: AnyVal: ClassTag] {
def hasType(x: AnyVal) = x match {
case _: A => true
case _ => false
}
}
它将如您所愿