【发布时间】:2016-02-24 12:23:46
【问题描述】:
我是 Scala 新手,遇到了一个无法在线找到解决方案的问题。所以我在这里寻求帮助。
我要做的是在A 类中实现两个map 方法。这两个方法都接受一个闭包,但是对于其中一个,闭包的返回值的类型是Tuple2。两个map 方法的返回值也不属于同一类(这就是为什么我需要两个'map' 方法)。代码简化如下:
object Test {
class A[T] {
def map[V](a: T => V): A[V] = {
null
}
def map[K, V](a: T => Tuple2[K, V]): B[K, V] = {
null
}
}
class B[K, V] extends A[Tuple2[K, V]] {}
def main(args: Array[String]) {
new A[Int].map(x => x + 1) //compile error
new A[Int].map{x => x + 1} //compile error
new A[Int].map{x:Int => x + 1} //passed but ugly in use
}
}
类A 和B 以及两个map 方法的定义在我的计算机上是Scala 可以接受的。问题来了。正如我在main 方法中展示的我如何在A 类中使用映射方法,前两个语句导致编译错误(在闭包中说缺少x 的参数类型)并且只有最后一个语句是可执行的。
如果我删除A 类中的第二个map 方法,前两个语句将变为可执行。我不知道为什么以及我应该怎么做。我只想让map的两个方法保持同名,同时在使用map方法时不需要告诉闭包的参数类型。
希望任何对此问题感兴趣的人,并为我提供更好的设计。提前致谢。
【问题讨论】:
-
您确定要重载
map函数吗?你问的问题很难在 scala 中实现。 -
@vitalii 是的,我只是希望
map函数在不同的情况下返回不同的类型(取决于闭包返回值的类型)。如果我可以得到B类的对象,那么我可以确定存储在B类中的值的类型是Tuple2,我还可以得到键和值的类型。 -
@Ben 我已经使用 C++ 4 到 5 年了,我确实认为 Scala 中的泛型等同于 C++ 中的模板。感谢您的指正。
标签: scala generics overloading