LINUX.ORG.RU

История изменений

Исправление 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)

  }

}