【发布时间】:2014-11-04 03:51:56
【问题描述】:
假设我有 A、B 和 C 类型,以及一个重载方法:
def foo(a: A): C
def foo(b: B): C
然后假设我有一段(复杂的)代码可以处理C 类型的对象。我想要的是一种采用A 或B 类型的方法:
def bar(x: [A or B]) = {
val c = foo(x)
// Code that works with c
}
当然我可以编写bar 的两个版本,重载以采用A 和B 类型,但在这种情况下,有多个函数的行为类似于bar,如果有的话会很愚蠢重载版本(在我的实际情况下,foo 有三个版本)。
C 风格的宏在这里会很完美,所以我想研究一下 Scala 宏。尴尬的是 Scala 宏仍然是类型检查的,所以我不能说
reify(foo(x.splice))
因为编译器想事先知道x 的类型。我对使用 Scala 宏完全陌生(它是一个重要的 API),所以在这方面的一些指针将不胜感激。
或者,如果有办法在没有宏的情况下布局此代码,那也会很有帮助!
【问题讨论】:
-
你可能可以用宏做这样的事情,但这真的,真的不是一个好主意(我说这是 Scala 宏系统的粉丝)。请改用类型类。
-
是的,类型类是个好主意。不过,我想知道(出于教育目的)是否有办法使用宏?看来应该可以了。
标签: scala overloading scala-macros