在 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
对不起,我是 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