在 Scala 中处理参数化 class 及其子 classes
Processing parameterized class and its sub classes in Scala
我有一个参数化的基础 class TBase,以及两个继承自它的子class: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 或其子classes 的实例。这是我试过的。
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
可能出了什么问题?或者,在具有各种类型特化的 subclasses 中调用方法的正确方法是什么?
编辑
我尝试 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
您可以使用存在类型声明更高种类的类型:
val a = Array[TBase[_]](new TInt, new TSeq)
我有一个参数化的基础 class TBase,以及两个继承自它的子class: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 或其子classes 的实例。这是我试过的。
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
可能出了什么问题?或者,在具有各种类型特化的 subclasses 中调用方法的正确方法是什么?
编辑
我尝试 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
您可以使用存在类型声明更高种类的类型:
val a = Array[TBase[_]](new TInt, new TSeq)