1

如何将对象的字段/方法与类型绑定?

我正在尝试做:

object CRUDable {

  private val allCRUDables = scala.collection.mutable.Map[String, CRUDableMeta[_]]()
  def add(crudable: CRUDableMeta[_]) { allCRUDables += (crudable.name -> crudable) }

我的编译器说:

type arguments [_$5] do not conform to trait CRUDableMeta's type parameter bounds [T <: etam.jpa.crud.CRUDable[T]]

我需要地图来接受任何类型的 CRUDableMeta[_]。

在此先感谢,埃塔姆。

4

1 回答 1

0

我冒昧地构建一个一般案例,因为我不知道 CRUD 并且它不起作用:

trait Data[T]
trait Meta[T <: Data[T]] { def name: String }
val all = collection.mutable.Map[String, Meta[_]]()

现在编译器会告诉你到底哪里出了问题

def add(c: Meta[_]) { all += c.name -> c }

它说:

error: type arguments [_$1] do not conform to trait
       Meta's type parameter bounds [T <: Data[T]]

因此,虽然 Scala 让您可以Map毫无抱怨地构造 (老实说我不知道​​为什么),但当您尝试将值实际存储在映射中时,您会遇到Meta类型参数的界限。T

解决方案是使用以下任一形式。(1) 方法的类型参数:

def add[T <: Data[T]](c: Meta[T]) { all += c.name -> c }

(2) 存在型

def add(c: Meta[T] forSome { type T <: Data[T] }) { all += c.name -> c }

不要问我关于(2)的问题,我一直忘记存在类型的全部内容......也许其他人可以在这里提供关于(1)或(2)是否更好的见解。(对相关问题的唯一答案表明 (1) 和 (2) 几乎相同,其中 (1) 还允许您随后引用 type T。虽然这里没有必要,但它仍然是更具可读性的版本, 我会说)

于 2012-06-19T00:08:46.050 回答