【发布时间】:2016-12-30 08:35:28
【问题描述】:
我有以下 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 的映射(Super 的任何子类型,OnlyErrorType 除外)。
我如何做到这一点?
上面的代码可以编译,但是我讨厌看到警告,
warning: abstract type pattern I is unchecked since it is eliminated by erasure
我认为必须有更好的方法来做到这一点。
【问题讨论】:
标签: scala types pattern-matching