は、一般的な機能を検討し、コンパイル時に非ジェネリック型を強制するには?はどのよう
私が解決したい下っ端の問題は、このようなものです:def addCase[T: ClassTag](...
、まだClassTag
:addCase
関数は型消去のようClassTag
を必要とすることによって解決することができ、警告、につながる
var actorReceive: Receive = PartialFunction.empty
def addCase[T](handler: T => Boolean): Unit = {
actorReceive = actorReceive orElse ({
case msg: T => // call handle at some point, plus some other logic
handler(msg)
})
}
addCase[List[Int]](_ => {println("Int"); true})
addCase[List[String]](_ => {println("String"); false})
actorReceive(List("str")) // will print "Int"
上記のコードは、と表示されません。警告やエラーは一切出されていませんが、何も出ていませんか?
あなたはここでakkaを扱っているので、私は「一般的な」メッセージをしようとすると大きな苦痛を感じるでしょう、特にシリアライゼーションの一種が進行中です。より一般的なレベルでは、IntとList [Int]の両方の型は両方とも*であるため、他の制限のない単一の型パラメータはそれらを区別しません。おそらく、標準的なtypeclassの解決策で十分でしょう。あるいは、dk14から提供されているようなより高度なものを使うこともできます。 – melps
あなたは 'List'から保護を加えることができます:http://stackoverflow.com/questions/15962743/using-context-bounds-negatively-to-ensure-type-class-instance-is-absent-from-s – dk14
しかし私はどのように多形型に遺伝的に生成するのかわからない – dk14