从任意类型到动态类型的隐式转换

8
为什么以下代码不起作用?(是的,我正在使用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".toInt 会采用哪个优先级: StringLike.toInt 还是 (new Dynamic {...}).applyDynamic("toInt")

1个回答

9
编译器首先从 String => { def hello: ? } 查找隐式视图。查找失败后,它会检查 String <: Dynamic。这些不会合并。
这个动态应用特性还没有最终确定——在Scala2.9.0中它是实验性的,并且可能会发生变化。但我怀疑它会被包含,因为使用这样的隐式视图会使所有类型安全都失效。你永远不会因为拼写错误的方法名或不正确的参数类型而得到编译错误。你的用例是什么?

1
你关于类型安全的想法是正确的。但是如果我将隐式函数限定在我的使用案例中implicit def X2Dynamic(x: X) = new X {...}(我的问题仍然存在,类型安全问题限定在X中),用于构建具有动态调用的DSL,这样就可以调用在xml中定义的方法,这只是一个初步的实验想法...顺便说一下,感谢您提供源链接! - Peter Schmitz
1
我认为这种行为非常棒。它可以允许在一个狭窄的范围内使用动态语言的能力。非常适合脚本或DSL。 - IttayD
@IttayD 我也是 ;) 至少在SO上回答一个体面的问题时要牢记这一点。 - Peter Schmitz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接