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は顧客の名前などです。

私が欲しいのは、スキーマを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

}

これが私がやろうとしていることを明確にすることを願っています。

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 に答える