2017-12-30 19 views
0

彼らは同じものを指し、まだ私は2種類のタグを比較する場合:スカラーで、マップ[_、_]とscala.collection.immutable.Map [_、_]はどのように異なるタイプタグを持っていますか?

val ttg1 = typeTag[Map[_,_]] 
val ttg2 = typeTag[immutable.Map[_,_]] 

assert(ttg1.tpe == ttg2.tpe) 

を私が得た:

Map[_, _] did not equal scala.collection.immutable.Map[_,_] 
ScalaTestFailureLocation: 
Expected :scala.collection.immutable.Map[_,_] 
Actual :Map[_, _] 

どのようにこれは型付けされた言語で起こるだろうか?どうすればそれらを同一にすることができますか?

UPDATE:一覧については、これはもっと混乱して:

val ttg1 = typeTag[List[_]] 
val ttg2 = typeTag[immutable.List[_]] 

assert(ttg1.tpe == ttg2.tpe) 

List[_] did not equal List[_] 
ScalaTestFailureLocation: 
Expected :List[_] 
Actual :List[_] 

彼らはまったく同じことです!しかし、反射はそれを無視することを選択します。

+0

あなたは 'scala.collection._'を少しでもインポートしていますか? – Dima

+0

@Dima私は 'scala.collection.immutable'をインポートしました、ごめんなさいインポートをコピーするのを忘れましたが、あなたは私のポイントを得ました – tribbloid

答えて

6

タイプの同一性が本当に必要な場合は、タイプIDを比較しています。

type A = B 

ABでは(それらが異なるタイプのタグを持っている理由である)同等の2つの異なるタイプがあります。等価性をテストするタイプに

assert(ttg1.tpe =:= ttg2.tpe) 

=:=にテストを変更してみてください。

+0

ありがとう!一般的なプログラマにとっては単純ではないように見えますが、 – tribbloid

+0

私は、リフレクションは中級から上級のトピックであると言っても過言ではないと思います。ほとんどのプログラマーはそれを使う必要はありません。 –

関連する問題