2つの "コンテナ"が同じ高級型を使用しているかどうかをテストしようとしています。次のコードを見て:しかし、私はコンフォーマンステストが成功することを期待Scalaで高級型の型適合性をテストする方法
false
Test.Funct[Option,Int]
scala.Option[_]
:
import scala.reflect.runtime.universe._
class Funct[A[_],B]
class Foo[A : TypeTag](x: A) {
def test[B[_]](implicit wt: WeakTypeTag[B[_]]) =
println(typeOf[A] <:< weakTypeOf[Funct[B,_]])
def print[B[_]](implicit wt: WeakTypeTag[B[_]]) = {
println(typeOf[A])
println(weakTypeOf[B[_]])
}
}
val x = new Foo(new Funct[Option,Int])
x.test[Option]
x.print[Option]
出力されます。私は間違って何をしていますか?より親切なタイプのテストはどのようにすればいいですか?私の場合は
明確化
、私は(この例でx: A
)をテストしていた値は、マクロでList[c.Expr[Any]]
に来ます。静的な解像度(私が与えたもの)に頼っている解決策は、私の問題を解決しません。
暗黙のうちに[Funct [Option、Int] <:
pedrofurla
https://gist.github。com/xeno-by/6054650型参照元がB型の型タグを認識しないので、weakTypeOf [Funct [B、_]]から正しい型を取得できないことがわかります。 –
さて、問題は何か分かりました。これは、型パラメータ定義で使用されたアンダースコアと他の場所とのミックスアップです。 'TypeTag [B [_]]のアンダースコアは実在する型を意味するので、' B'ではなく、実在するラッパーの型タグを取得します。その結果、 'typeOf [Funct [B、_]]'はこのタイプタグを使うことができず、動揺します。 –