0

我是Scala和隱式轉換的新手。如何覆蓋隨播對象的隱式函數?

我正在使用現有的scala庫,我無法控制它。讓我們從庫中考慮一個R類。

abstract class R { 

} 

object R { 
    implicit def RFunctions[K, V](r: R[(K, V)]) (implicit kt: ClassTag[K],vt: ClassTag[V], ord: Ordering[K] = null): RFunctions[K, V] = { new RFunctions(r) } 
} 

我在擴展R類以覆蓋它的幾乎所有行爲。但是這個新類是一個Java類。讓我們把這種A.

class A extends R { 

} 

問題是,在我的控制流程的某個時刻,控制跳轉到R的隱式聲明和使用RFunctions類的任何功能結束。

存在於RFunctions中的方法也在我的擴展類A中實現。我不明白我如何繞過或避免隱式轉換。

任何想法,將不勝感激。

+0

嗯...'隱式'在Java中?如果你將它翻譯成Java,然後完全翻譯它。你不會找到在Java中使用implicits的簡單方法。 –

+0

如果您的類A具有所有RFunction方法,那麼在應用任何隱式轉換之前它們將被調用 –

+0

您不能。在代碼的某些地方,特別是在外部庫中,某些變量的靜態類型將是R,即使在運行時它實際上是A.因此,隱式轉換無論如何都會發生,無論您做什麼,因爲編譯器並非全知足以推論。實際上,RFunctions和R之間沒有打字關係。您不能從R的子類「實現」RFunction的方法,因爲它們是恰好通過轉換方法鏈接的獨立實體。 – HTNW

回答

0

在斯卡拉擴展abstract class Rabstract class Rbis,並在同伴object Rbis定義你所需要的隱函數(他們會在我們的例子中R的那些之前被調用),然後在你的java擴展Rbis