我真的很喜欢使用上限类型边界来给我的结构可以采取一些灵活性。不过,我真的不知道它的任何背后的原理,因为我用下面的代码中找到:斯卡拉上限类型边界和父类
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
s与Service
s不同?在这里可以参考Service
还是不可能的?
还是我吠叫完了错误的树?谢谢!