从任意形式到动态形式的隐式转换

问题描述:

为什么不是以下工作? (是的,我与2.9.0final工作,打开了“-Xexperimental”的选项。)从任意形式到动态形式的隐式转换

implicit def any2Dynamic(a: Any) = new Dynamic { 
    def applyDynamic(name: String)(args: Any*) = { 
    println(a + name) 
    } 
} 

"Say".hello // value hello is not a member of java.lang.String 

一个可以争论多么有意义,这是...如果如预期这会工作什么优先次序将在"Say".toIntStringLike.toInt(new Dynamic {...}).applyDynamic("toInt")

编译器第一个looks为从String => { def hello: ? }隐式视图。那失败了,所以它checks如果String <: Dynamic。这些不合并。

这个动态应用程序功能还没有最终确定 - 在斯卡拉2.9.0它是实验性的,并且可能会有变化。但我怀疑这会被包括在内,就像这样一种隐含的,你把所有类型的安全都扔到了窗外。对于拼写错误的方法名称或不正确的参数类型,您永远不会收到编译错误。你的用例是什么?

+1

您的权利与类型安全。但是如果我将隐式def限制在我的用例'implicit def X2Dynamic(x:X)= new X {...}'(我的问题仍然存在,类型安全问题仅限于'X')以构建带有动态调用,所以可以调用方法,例如用xml在外部定义。到目前为止只是一个实验...顺便说一句,感谢您的链接源! – 2011-05-15 14:45:22

+1

我其实觉得这种行为很好。它可以允许在狭窄的范围内使用动态语言功能。非常适合脚本或DSL。 – IttayD 2011-05-15 14:47:25

+0

@IttayD我也是;)至少要记住,当涉及到一个复杂的答案这里一个体面的问题。 – 2011-05-15 14:55:23