我是Scala的新手,我遇到了一個我無法在線找到解決方案的問題。所以我在這裏尋求幫助。在Scala中重載泛型方法
我想要做的是在類A
中實現兩個map
方法。這兩個方法都接受一個閉包,但對於其中的一個,閉包的返回值的類型是Tuple2
。另外兩個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
一些觀點:(i)Scala具有泛型而不是模板 - 請參閱[這裏](http://stackoverflow.com/a/498329/4070984)討論差異。 (ii)你在談論的是方法而不是函數,這在Scala中是非常不同的(函數是對象,不能被重載或泛型) - 請參閱[這裏](http://stackoverflow.com/a/2530007/4070984)。我已提交修改以糾正這些問題。 – Ben
@vitalii是的,我只是想'map'函數在不同情況下返回不同的類型(取決於閉包的返回值的類型)。如果我可以得到類「B」的對象,那麼我可以確定存儲在類「B」中的值的類型是一個「Tuple2」,我也可以獲得鍵和值的類型。 –