scala - Using private mutable collections of a covariant type -


i have covariant scala type thing[+b]. implementation uses internal mutable queue:

private val queue : asyncqueue[b]()

asyncqueue custom mutable queue implementation, special properties can't implement in immutable version. because it's mutable, asyncqueue invariant. can't use in covariant type thing.

since queue private, can guarantee correctness of code: e.g. won't try assign queue reference of type queue[any]. how can make work, keeping thing covariant in b, without using casts?

(the solution casts declare asyncqueue[object] , cast objects on enqueue/dequeue, ugly.)

eta: understand type covariance, , understand why shouldn't able declare asyncqueue of covariant type, or make asyncqueue covariant. question how design code avoid using casts everywhere.

you can make member immune variance check making private[this], according the spec.

scala> trait thing[+a] { def next(): } defined trait thing 

expectedly,

scala> class thingie[+a](implicit t: classtag[a]) extends thing[a] { val = mutable.arraybuffer.fill[a](10)(t.runtimeclass.newinstance.asinstanceof[a]) ; private val = as.iterator ; def next() = it.next() } <console>:12: error: covariant type occurs in invariant position in type => scala.collection.mutable.arraybuffer[a] of value        class thingie[+a](implicit t: classtag[a]) extends thing[a] { val = mutable.arraybuffer.fill[a](10)(t.runtimeclass.newinstance.asinstanceof[a]) ; private val = as.iterator ; def next() = it.next() } 

but

scala> class thingie[+a](implicit t: classtag[a]) extends thing[a] { private[this] val = mutable.arraybuffer.fill[a](10)(t.runtimeclass.newinstance.asinstanceof[a]) ; private val = as.iterator ; def next() = it.next() } defined class thingie 

and

scala> class x defined class x  scala> val xs = new thingie[x] xs: thingie[x] = thingie@49f5c307  scala> xs.next res1: x = x@4816c290 

Comments

Popular posts from this blog

how to proxy from https to http with lighttpd -

android - Automated my builds -

python - Flask migration error -