1

クラス A が特性 B を拡張しているかどうかを確認するために、2 つのクラス マニフェスト (暗黙的に取得) を比較したいと考えています。以下のコードは、クラスがインターフェイスを拡張するかどうかを確認する場合に true を返す必要があります。

trait X[T,S]

class Y extends X[Double,Int]


val mX = implicitly[ClassManifest[X[Double,Int]]]
val mY = implicitly[ClassManifest[Y]]

println(mX <:< mY)

println(mY <:< mX)

println(mX,mY)

ただし、ターミナルから次の出力が得られます。

felix@felix-UX32VD:~/Desktop$ scala Test.scala
false
false
(Main$$anon$1@7ad0e999.type#Main$$anon$1$X[Double, Int],Main$$anon$1@7ad0e999.type#Main$$anon$1$Y)

誰かがこの動作を説明できますか?

4

2 に答える 2

2

マニフェストの動作が壊れています。これが、2.10 でTypeTagsに置き換えられた理由です。これらは、基になる型に直接作用します。

scala> typeTag[Y].tpe <:< typeTag[X[Double,Int]].tpe
res21: Boolean = true

scala> typeOf[Y] <:< typeOf[X[Double,Int]]
res22: Boolean = true

2.10 では、マニフェストの使用を廃止するという考えがありましたが、新しいリフレクション ライブラリの品質がまだ適切なレベルに達していないため、この考えは却下されました。これは、マニフェストを引き続き使用できることを意味しますが、いつの日か標準ライブラリから削除されることを念頭に置いておいてください。

于 2012-11-14T18:42:57.050 に答える
0

ClassManifests 間のサブタイプの関係ではなく、消去されたタイプ間のサブタイプの関係に実際に関心があるように見えます。多分これはあなたのために働く:

println(mX <:< mY) // false
println(mX.erasure.isAssignableFrom(mY.erasure)) // true

println(mY <:< mX) // false
println(mY.erasure.isAssignableFrom(mX.erasure)) // false
于 2012-11-14T16:54:37.367 に答える