在Scala中处理参数化类及其子类

时间:2016-03-29 19:56:55

标签: scala types template-specialization specialization

我有一个参数化的基类TBase,以及两个继承自它的子类:TInt和TSeq。

abstract class TBase[T](val name:String)
{
    def encode(value:T) : Array[Byte]
    def decode(byteArray: Array[Byte]) : T
    def check(value:T) : Boolean
}

class TInt extends TBase[Int]("int")
{
    override def encode(value: Int) = {
        Array[Byte](value.toByte, value.toByte, value.toByte)
    }
    override def decode(byteArray: Array[Byte]) : Int = {
         byteArray.size   
    }
    override def check(value:Int) : Boolean = {
        if (value > 0) true
        else false
    }
}

class TSeq extends TBase[Seq[Int]]("seq")
{
    override def encode(value: Seq[Int]) = {
        Array[Byte](value.toByte, value.toByte, value.toByte)
    }
    override def decode(byteArray: Array[Byte]) : Seq[Int] = {
        Array[Int]()
    }
    override def check(value:Seq[Int]) : Boolean = {
        true
    }
}

我需要迭代TBase或其子类的实例。这就是我的尝试。

object Main extends App {
    val a = Array[TBase[Any]](new TInt, new TSeq) <--
    a.foreach {i => 
        println(i.decode(Array[Byte]()))
    }
}

我收到了错误消息。

error: kinds of the type arguments (this.TBase) do not conform to the expected kinds of the type parameters (type T).
this.TBase's type parameters do not match type T's expected parameters:
class TBase has one type parameter, but type T has none
    val a = Array[TBase](new TInt, new TSeq)
                 ^
one error found

可能有什么问题?或者,在具有各种类型特化的子类中调用方法的正确方法是什么?

修改

我尝试使用abstract class TBase[+T <: Any](val name:String) val a = Array[TBase[Any]]来解决这些错误。

T vs Any/16-3. inheritance.scala:3: error: covariant type T occurs in contravariant position in type T of value value
    def encode(value:T) : Array[Byte]
               ^
T vs Any/16-3. inheritance.scala:5: error: covariant type T occurs in contravariant position in type T of value value
    def check(value:T) : Boolean
              ^
two errors found

1 个答案:

答案 0 :(得分:2)

您可以使用存在类型声明更高级的kinded类型:

val a = Array[TBase[_]](new TInt, new TSeq)