我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