Scala隐式转换:类型类模式与技术问题解析
1. 表达式问题与解决方案探索
在Scala的REPL会话中,我们可以看到如下操作:
scala> val jsonobj = json"{name: $name, book: $book}"
jsonobj: scala.util.parsing.json.JSONObject = \
{"name" : "Dean Wampler", "book" : "Programming Scala, Second Edition"}
scala> println(jsonobj)
{"name" : "Dean Wampler", "book" : "Programming Scala, Second Edition"}
这里我们有效地在不编辑任何类型源代码的情况下,为所有类型添加了新方法,这就引出了“表达式问题”。该问题由Philip Wadler提出,指的是在不修改模块源代码的前提下对其进行扩展的需求。
面向对象编程通过子类型化(更准确地说是子类型多态)来解决这个问题。我们编写抽象代码,并在需要改变行为时使用派生类。Bertrand Meyer提出的开闭原则描述了这种面向对象编程的方法,即基类型在抽象中声明行为,子类型实现行为的适当变体,而不修改基类型。
然而,Scala虽然支持这种技术,但也存在缺点。例如,如果某种行为是否应定义在类型层次结构中存在疑问,或者该行为仅在少数上下文中需要,而在大多数上下文中对客户端代码来说是一种负担。这种负担体现在两个方面:一是额外的未使用代码会占用系统资源,随着代码库的