【发布时间】:2021-01-15 20:05:32
【问题描述】:
我正在尝试定义一个以参数化类为键的映射。但是当我尝试添加它时,我得到一个编译器错误:
trait MyTrait[T <: MyTrait[T]]
case class A(i: Int) extends MyTrait[A]
case class B(str: String) extends MyTrait[B]
var map = Map[Class[_ <: MyTrait[_]], Int]()
def update[T <: MyTrait[T]](n: Int) = {
map += classOf[T] -> n // Won't compile
}
我收到以下编译器错误:
Expression does not convert to assignment because:
class type required but T found
expansion: map = map.+(classOf[T].<$minus$greater: error>(n))
map += classOf[T] -> n
将我的课程提取为密钥的正确方法是什么?例如,如果我使用具体的类,它编译得很好:
map += classOf[A] -> n
【问题讨论】:
-
要使
classOf与泛型一起工作,您必须指定您希望在运行时拥有类型信息。通常你需要一些ClassTag魔法。 -
这里的问题是
T是type而不是一个类,因此classOf将不起作用。您将需要使用反射来提取该类型的类。 -
像 F-Bound 多态性、可变映射和想要使用类作为键之类的东西对我来说都是代码味道。请问您要解决的元问题是什么?
标签: scala types implicit f-bounded-polymorphism classtag