История изменений
Исправление quasimoto, (текущая версия) :
List это не список, а immutable список. А с MutableList уже не работает
List ковариантен, то есть List[+A], так что справедливо A <: B => List[A] <: List[ B ] и соответствующие конверсии. MutableList при этом инвариантен, то есть MutableList[A] - без конверсий, возможную ковариантность нужно задавать явно:
import scala.collection.mutable._
class A(xi: Int) {
var x: Int = xi
override def toString() = "A(" + x + ")"
}
class B(xi: Int, yi: String) extends A(xi) {
var y: String = yi
override def toString() = "B(" + x + ", \"" + y + "\")"
}
object Test {
def push[T <: A](xs: MutableList[T], elem: T) {
println("add elem: _ <: A with elem.x = " + elem.x)
xs += elem
}
def test = {
val xs: MutableList[A] = MutableList(new A(1), new B(2, "b"))
val ys: MutableList[B] = MutableList(new B(3, "c"), new B(4, "d"))
push(xs, new A(3))
push(xs, new B(4, "d"))
push(ys, new B(5, "e"))
println(xs)
println(ys)
}
}
Исходная версия quasimoto, :
List это не список, а immutable список. А с MutableList уже не работает
List ковариантен, то есть List[+A], так что справедливо A <: B => List[A] <: List и соответствующие конверсии. MutableList при этом инвариантен, то есть MutableList[A] - без конверсий, возможную ковариантность нужно задавать явно:
import scala.collection.mutable._
class A(xi: Int) {
var x: Int = xi
override def toString() = "A(" + x + ")"
}
class B(xi: Int, yi: String) extends A(xi) {
var y: String = yi
override def toString() = "B(" + x + ", \"" + y + "\")"
}
object Test {
def push[T <: A](xs: MutableList[T], elem: T) {
println("add elem: _ <: A with elem.x = " + elem.x)
xs += elem
}
def test = {
val xs: MutableList[A] = MutableList(new A(1), new B(2, "b"))
val ys: MutableList[B] = MutableList(new B(3, "c"), new B(4, "d"))
push(xs, new A(3))
push(xs, new B(4, "d"))
push(ys, new B(5, "e"))
println(xs)
println(ys)
}
}