6

我很难弄清楚如何在 scala 中存储或传递类型。

我想要实现的是这样的:

abstract class Foo( val theType : type )
object Foo{
   case object Foo1 extends Foo(String)
   case object Foo2 extends Foo(Long)     
}

所以在某些时候我可以这样做:

theFoo match{
   case String => "Is a string"
   case Long => "Is a long"
}

并且在获得能够投射它的对象时:

theFoo.asInstanceOf[Foo1.theType]

这可能吗?如果可能,是一个好的方法吗?我最终想要实现的是为字节流处理编写一个伪模式。例如,如果我有一个架构Array(Foo1,Foo1,Foo2,Foo3,Foo1),我可以解析与该架构抱怨的字节数组,如果在某个时候我有不同的字节流,我可以编写一个新架构Array(Foo3, Foo4, Foo5)而无需重新实现解析逻辑。

问候,


按要求编辑

假设我有一个名为 Command1 的 Array[Byte] = A973928CB3883FB123

该字节中的数据在位置和长度上是固定的。换句话说,我知道位置 1-4 是一个小日期,5-9 是客户的名字等等。

我想要的是编写一个解析函数,它仅将模式作为参数并返回模式中每个参数的实际值。

trait Command{

  //This is implemented in every command
  val schema : List[Tuple[String,Int,Int,Type]]  //Position,Size,DataType

  def parse() : List[Tuple[String,Int,Int,Type,Any]] = schema.map(//match using the type)
}

class Command1 extends Command {
  override val schema = List[Tuple("theName",0,10,String),Tuple("myType",10,12,MyType),Tuple("theId",13,20,Long)]
  val theActualName = parse().find(_._1 == "theName")._5.asInstanceOf[String] //I would like to avoid this cast

}

我希望这能澄清我正在尝试做的事情。

4

2 回答 2

3

您可以使用 Scala 2.10(当它出现时)将类型作为值。在此之前,你能得到的最好的就是类(classOf[String]例如),但这会丢失任何类型参数。

即使使用 Scala 2.10,您也会遇到一些严重的限制。例如,请参阅我最近的一篇博客文章

于 2012-09-05T02:22:31.870 回答
0

您不能将类型存储在变量中。而且您也不能简单地将字节流转换为类型。您可以做的是使用像protobuf这样的序列化库。你的用例到底是什么?你从哪里得到数据?它也是一个 java/scala 应用程序吗?如果您能说出您到底想做什么,那么帮助您可能会更容易。

于 2012-09-04T21:52:46.383 回答