Мне действительно нравится использовать верхние границы типов, чтобы придать некоторую гибкость тому, что могут принимать мои конструкции. Тем не менее, я действительно не знаю ни одного из принципов, лежащих в основе этого, как я нахожу со следующим кодом:
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
с? Здесь можно сослаться на Service
или это невозможно?
Или я полностью лаю не на том дереве? Спасибо!