タイプを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は顧客の名前などです。
私が欲しいのは、スキーマをparammeterだけとして受け取り、スキーマ内のすべてのparamの実際の値を返す単一の解析関数を作成することです。
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
}
これが私がやろうとしていることを明確にすることを願っています。