我有以下的scala代碼。將子類作爲參數傳遞給具有超類作爲參數的函數的參數
trait Super
case class Sub(value:String) extends Super
case class YetAnotherSub(value:String) extends Super
case class OnlyErrorType(value:String) extends Super
def function1[I <: Super, R](mapper : (I) => R, input: Super) (default: R): R = input match {
case error: OnlyErrorType =>
default
case success: I => mapper(success) // Ideally success => mapper(success)
case _ => default // I don't want this line at all, as I'm not expecting any other type
}
def function2(input:String):Super = if(input.size >= 3) Sub("Greater") else OnlyErrorType("Lesser")
def function3(input:String):String = {
val result = function2(input)
function1({sub:Sub => sub.value.toUpperCase}, result) ("Empty Result")
}
function3("Input")
有各種功能類似於function2
它接受一些參數和返回的Super
任何亞型。我想有一個通用的映射器,像function1
,類型爲Super
映射到一些其他類型的,但在OnlyErrorType
換句話說情況下返回默認值,我想有一些默認處理爲OnlyErrorType
,但讓調用函數(在此例中爲function3
)指定SuccessType的映射(除OnlyErrorType
之外的Super
的任何子類型)。
我該如何做到這一點?
上面的代碼編譯,但我討厭看到警告,
warning: abstract type pattern I is unchecked since it is eliminated by erasure
我覺得必須有一個更好的方式來做到這一點。
我會喜歡你的第一個建議,如果它的工作。它不會編譯。 – nobody
修正了這個建議。 –