在 Scala 中,如何在这种情况下在基本抽象 class 中声明正确的类型以按索引访问

In Scala, how can i declare right type in base abstract class to access by index in this situation

对不起,我是 Scala 的新手。

我的代码如下所示。

abstract class A{
  val container: Any
  //Some other member and methods are hidden
}

class B extends A {
  val container: Vector(1,2)
  //Some other member and methods are hidden
}

class C extends A {
  val container: ArrayBuffer(1,2,3)
  //Some other member and methods are hidden
}

所以,当我想像下面这样在 main 函数中使用这些函数时,这意味着我打算通过索引访问 container

val vector = new ArrayBuffer[A].empty
vector += new B
vector += new C
  
for( vec <- vector ){
  println(vec.container(0))
}

但是,编译器说“Any 不带参数”

所以,我的问题是,我应该如何在基 class 中声明值 container 以访问带有索引的输入。

帮帮我,谢谢。

至少有 2 个变体:

import scala.collection.mutable.ArrayBuffer
import scala.collection.immutable.Vector
import scala.collection.IndexedSeq

// variant 1
trait A1[T] {
  def container: IndexedSeq[T]
}

class B1 extends A1[Int] {
  val container: Vector[Int] = Vector(1, 2)
}

class C1 extends A1[Long] {
  val container: Vector[Long] = Vector(1, 2)
}

// variant 2
trait A2 {
  def container: IndexedSeq[_]
}

class B2 extends A2 {
  val container: Vector[Int] = Vector(1, 2)
}

class C2 extends A2 {
  val container: ArrayBuffer[Long] = ArrayBuffer(1, 2)
}

object Main extends App {
  val coll1 = new ArrayBuffer[A1[_]]()
  coll1 += new B1()
  coll1 += new C1()
  val coll2 = new ArrayBuffer[A2]()
  coll2 += new B2()
  coll2 += new C2()
  
  for( vec <- coll1 ) {
    println(vec.container(0))
  }
  for( vec <- coll2 ) {
    println(vec.container(0))
  }
}

在 Scala 2.13.6

上测试 here