我很难弄清楚如何在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),而不必重新实现解析逻辑。
致以敬意,
按要求编辑
假设我有一个名为ArrayByte = A973928CB3883FB123的Command1
这个字节中的数据在位置和长度上是固定的。换句话说,我知道位置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
}我希望这能澄清我想做什么。
发布于 2012-09-04 21:52:46
不能将类型存储在变量中。而且,您也不能简单地将字节流转换为类型。您可以做的是使用像原生质这样的序列化库。你的用例到底是什么?你从哪里得到数据的?它也是一个java/scala应用程序吗?如果你能告诉你你到底想做什么,那么帮助你就更容易了。
发布于 2012-09-05 02:22:31
您可以使用Scala2.10作为值来获取类型(当它出现时)。在此之前,您能得到的最好的是类(例如,classOf[String]),但是这会丢失任何类型参数。
即使使用Scala2.10,也会遇到一些严重的限制。参见我最近的一个博客帖子作为一个例子。
https://stackoverflow.com/questions/12271690
复制相似问题