私の構造が取ることができるものに柔軟性を与えるために、上の型の境界を使用するのが本当に好きです。私は私のクラスは限りそれは一貫性のあるようService
のサブクラスを使用することができることをしようとしているスカラの上限型の境界と親クラス
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
}
}
:私は次のコードで見つけしかし、私は本当にそれの原理のいずれかを知りません。しかし、これは動作しません:
$ 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にの複数の値がService
であるように宣言するにはどうすればよいですか?ここでService
を参照することは可能ですか、それは不可能ですか?
または間違ったツリーを完全に吠えていますか?ありがとう!