よくわからない

最近プログラミング言語 scala にはまっているが、どうもよくわからない動作が多い。

val map = new scala.collection.mutable.HashMap[Class[_], AnyRef => String ]
def f(value:Class[_]) = map.getOrElse(value,null) 
f(classOf[String]) 

// f の呼び出し中に map.getOrElse で例外発生
class TypeEx(self:Class[_]) { def getNameEx() = self.getName() }
implicit def toTypeEx[_](t:Class[_]):TypeEx = new TypeEx(t)

classOf[Int].getNameEx() // OK

var r1:Class[_] = classOf[Int]
r1.getNameEx() // OK

val r2:Class[_] = classOf[Int]
r2.getNameEx() // コンパイルエラー!!! (valだとimplicit convertion は使えないのか?)

val r3 = classOf[Int]
r3.getNameEx() // OK (valなのにOK。valで型を指定しているからダメだったのか?)

val s:String = "ABC"
s.r // OK (rはStringを暗黙の型変換で変換したRichStringのメンバ。valで型を指定しているのにOK)

環境