2012-04-24 4 views
1

マップ内の2番目のタイプのパラメータのマニフェストを取得するにはどうすればよいですか?

例えば、次の関数:マップ内の値タイプのマニフェストには、タイプNothingが与えられます。

として呼び出さ
def asMap[T <: AnyRef]()(implicit m : Manifest[T]) : Map[Int, T] = { 
    println(m) // Nothing 
    ... 
    } 

:暗黙のmパラメータは、アレイに対応を行う Nothing

に結合さ

val map : Map[Int,String] = asMap() 

def asArray[T <: AnyRef]()(implicit m : Manifest[T]) : Array[T] = { 
    println(m) // java.lang.String 
    ... 
    } 

のように呼び出します:暗黙のM-パラメータがjava.lang.Stringににバインドされている

val arr : Array[String] = asArray() 

から

を予想通り誰もが、説明していただけますか?

答えて

2

Mapはその2番目のパラメータで共変なので、それはだように見えます:Map[A, B+]Arrayはそのタイプで不変であるのに対し:Array[T]

+1

Scalaは最も制限の厳しいタイプ(つまり、Nothing)を選択し、必要な場合にのみ拡大するためです。 –

+0

だから、実際のタイプを手に入れることは可能ですか? – Harald

+0

@Harald - val map = asMap [String] 'はあなたが望むことをします。または、実際に作成されたマップを渡すことができます。ここでは、使用するタイプの選択肢がなくなります。 –

2

私はあなたが何をしているのかよく分かりません。マップを引数として使用しないと、どのようにパラメータを取得できますか?

def getManifest[A,B: Manifest](map: Map[A,B]) = manifest[B] 

val map = Map(1 -> "one") 
getManifest(map) //Manifest[java.lang.String] = java.lang.String 
関連する問題