2016-07-05 4 views
1

呼び出し元が利用可能な型情報を持っていて、def write[T : Writer](x: T)と呼ぶことができるように、プログラムで使用されるAPIがあるとします。ことを考えると型なしのREST APIからスカラ型クラスベースのAPIを再利用する方法

しかし、今は型なしで、REST APIは、IDが動作するため、我々は、手元に型情報を持っていないあなたのREST APIからこれらの型クラスを再利用したいと思います...今

Tのすべてのインスタンスは、我々はそれにTypeTagを関連付けることができ、先行インスタンス化されているので、...あなたのREST APIはid -> instance-of-TMapを保持し、それを書くことができ、適切なタイプのクラスを解決するために、そのインスタンスからTypeTagを得ることができる

問題は、暗黙的にTypeTagsしか使用できない型クラスを解決するにはどうすればいいですか?

+0

これは、「XYの問題」のように聞こえます。あなたは本当に何を達成したいのですか? 'TypeTag'はリフレクションを使用しますが、コンパイル時の安全性は保証されません。コンパイル時の安全性がなければ、なぜ型を悩ますのでしょうか? – Haspemulator

答えて

0

あなたはとにかくすべてのインスタンスをキャッシュしている場合、このような何かがうまくいくかもしれない:

trait Entity { 
    val id: Long 
} 

trait Writer[T] { 
    def write(x: T): String 
} 

var cache = Map[Long, (Any,() => String)]() 

def cacheObj[T <: Entity](x: T)(implicit writer: Writer[T]): Unit = { 
    cache = cache + (x.id -> (x,() => writer.write(x))) 
} 

def serveObj(id: Long): String = { 
    val (x, write) = cache(id) 
    write() 
} 
+0

ねえ、私はそれをすることはできません。ライターは、実際には多くのことをするものであり、シリアライザのようなものではありません。デフォルトでは10個のエンティティしか存在せず、ユーザから提供されたエンティティが存在し、ライタのタイプクラスの証拠も提供することが義務付けられています。想像してみれば、TypeclassはViewIntrospectorのようなもので、s3、ElasticSearchなどのビューをイントロスペクティングしています。 – lisak

+0

REST APIであなたのエンティティとライターとしたいことのコード例を教えてください。 – devkat

関連する問題