我想寫一個函數,它應該根據輸入返回不同的對。我已經覆蓋了Scala中的「+ -/*」以供我特定的使用。每一個(+, - ,*,/)都有三個基於輸入的實現。我有RDD和Float作爲輸入,因此它可以是RDD和RDD之間的+,或Float和RDD,或者Float和Float等。如何在Scala中爲函數分配不同的返回類型?
現在我有一個解析器,它從輸入讀取表達式,如:RDD + 1,解析它並創建後綴,使計算變得更簡單,如:RDD1 +,然後我想用我實現的+進行計算。在this algorithm的幫助下,我試圖改變它的方式,使其根據我的輸入表達式進行計算。例如,它包含:
var lastOp: (Float, Float) => Float = add
我怎樣才能改變這一點:(Float, Float) => Float
的東西,將接受(RDD, Float)|(RDD, RDD) |(Float, Float) => RDD = add
//我實現附加的???
版:
我加入這部分有以下兩個答案的幫助: 好,我寫了這個:
def lastop:(Either[RDD[(Int,Array[Float])], Float], Either[RDD[(Int,Array[Float])], Float]) => RDD[(Int,Array[Float])] = sv.+
其中SV是從我的其他類的實例,我一直覆蓋在但在兩種不同的方式所以現在我是個讓我猜的錯誤+是因爲編譯器會很困惑,要使用哪種實現,這是
error: type mismatch;
[error] found : (that: org.apache.spark.rdd.RDD[(Int, Array[Float])])org.apache.spark.rdd.RDD[(Int, Array[Float])] <and> (that: Float)org.apache.spark.rdd.RDD[(Int, Array[Float])]
[error] required: (Either[org.apache.spark.rdd.RDD[(Int, Array[Float])],Float], Either[org.apache.spark.rdd.RDD[(Int, Array[Float])],Float]) => org.apache.spark.rdd.RDD[(Int, Array[Float])]
注意:它發現它是兩個不同的實現「+」
您可以使用函數重載?也就是說,用不同的參數類型來實現這些方法中的每一個。 – marios
afaik,爲了這個工作,你必須以相同的方式實現你的'add'函數。所以你將只有一個使用Either的實現,而不是幾個重載的實現。不過,我會用第三個選項更新我的答案,希望能夠更好地滿足您的需求。 –
對不起,對於第三種選擇,我正在考慮數字[T],現在我認爲它是行不通的。但是,我更新了我的答案,我認爲可能會發揮作用。我不認爲你描述的內容完全可能與你描述的一樣。 –