【发布时间】:2021-10-05 19:51:05
【问题描述】:
您好,我想在 scala 中创建一个通用包装器,以跟踪任何类型的值的变化。到目前为止,我不知道/还没有找到任何其他方法,我正在考虑创建一个类,我一直在尝试使用 Dynamic,但它有一些限制。
case class Wrapper[T](value: T) extends Dynamic {
private val valueClass = value.getClass
def applyDynamic(id: String)(parameters: Any*) = {
val objectParameters = parameters map (x => x.asInstanceOf[Object])
val parameterClasses = objectParameters map (_.getClass)
val method = valueClass.getMethod(id, parameterClasses:_*)
val res = method.invoke(value, objectParameters:_*)
// TODO: Logic that will eventually create some kind of event about the method invoked.
new Wrapper(res)
}
}
使用这段代码时,我在两个整数上调用 plus("+") 方法时遇到了麻烦,我不明白为什么。 Int 类中没有“+”方法吗?当我尝试使用两种 Wrapper/Int 进行添加时遇到的错误是:
var wrapped1 = Wrapper(1)
wrapped1 = wrapped1 + Wrapper[2] // or just 2
type mismatch;
found : Wrapper[Int]/Int
required: String
为什么它需要一个字符串?
如果可能的话,能够无缝地使用 Wrapper[T] 和 T 方法也很好,例如
val a = Wrapper[Int](1)
val b = Wrapper[Int](2)
val c = 3
a + b // Wrapper[Int].+(Wrapper[Int])
a + c // Wrapper[Int].+(Int)
c + a // Int.+(Wrapper[Int])
【问题讨论】:
-
您最终会发现原语在 Scala 中是未装箱的。我已经写了一篇 20 页的论文,关于您正在尝试做的事情,这只是冰山一角。根据你想走多远,你会遇到一百万个不同的问题。 tl;dr 如果不编写编译器插件来显式改变某些东西的工作方式,这实际上是不可能完全扩展的。
标签: scala