我真的很喜欢使用类型上限来为我的构造提供一些灵活性。但是,我真的不知道它背后的任何原理,正如我在以下代码中发现的那样:
object BoundsTest {
abstract trait Service
class Collection[T <: Service] extends collection.mutable.HashMap[Symbol, collection.mutable.Set[T]] with collection.mutable.MultiMap[Symbol, T]
type Actives[T <: Service] = collection.mutable.HashMap[Symbol, T]
class Library[T <: Service](collection: Collection[T], actives: Actives[T])
private val libraries = new collection.mutable.HashMap[Symbol, Library[Service]]
def setLibrary[T <: Service](name: Symbol, library: Library[T]) {
libraries += name -> library
}
}
我试图让我的类可以使用一个子类,Service
只要它是一致的。但是,这不起作用:
$ scalac test.scala
test.scala:10: error: type mismatch;
found : com.bubblefoundry.BoundsTest.Library[T]
required: com.bubblefoundry.BoundsTest.Library[com.bubblefoundry.BoundsTest.Service]
Note: T <: com.bubblefoundry.BoundsTest.Service, but class Library is invariant in type T.
You may wish to define T as +T instead. (SLS 4.5)
libraries += name -> library
^
我认为,问题在于我如何(以及何时?)定义libraries
,好像我进行了以下更改,一切都成功编译:
// private val libraries = new collection.mutable.HashMap[Symbol, Library[Service]]
def setLibrary[T <: Service](name: Symbol, library: Library[T]) {
new collection.mutable.HashMap[Symbol, Library[T]] += name -> library
}
如何声明一个libraries
HashMap 以使其具有多个Library
具有不同Service
s 的 s?可以参考Service
这里还是那不可能?
还是我完全在错误的树上吠叫?谢谢!