我Dynamic
從斯卡拉添加變量2.10.0-RC1是這樣的:避免顯式轉換爲Scala的動態類型
import language.dynamics
import scala.collection.mutable.HashMap
object Main extends Dynamic {
private val map = new HashMap[String, Any]
def selectDynamic(name: String): Any = {return map(name)}
def updateDynamic(name:String)(value: Any) = {map(name) = value}
}
val fig = new Figure(...) // has a method number
Main.figname = fig
現在,如果我要訪問Main.figname.number
這是行不通的,因爲編譯器認爲它的類型是Any
。
但它也是Main.figname.isInstanceOf[Figure] == true
,所以它的Any
和Figure
,但沒有Figures
能力。現在我可以投它,Main.figname.asInstanceOf[Figure].number
,它的工作原理!這很醜陋!並且我無法向我的域用戶展示此內容(我想構建內部DSL)。
注意:如果我使用的是Figure
的超類型,而不是Any
,它也不起作用。
這是scala 2.10中的一個bug還是一個特性?
作爲一個說明,我不得不將'selectDynamic'定義爲'def selectDynamic [T](name:String):DynamicBase'而不是'def selectDynamic(name:String):DynamicBase'。多餘的類型參數在這裏使編譯器感到高興,否則它會在調用'as'時產生扼制(即「selectDynamic」不會接受類型參數,即使對'as'的調用是直接的並且不會通過'selectDynamic'。它看起來是一個bug。 –
這個效果很好,謝謝你! – Themerius