问题是return
您的代码中使用了。您说过您在某处的函数中使用了此代码段。该函数的返回类型是什么?显然,您打算有时是Integer,有时是String,有时是BigDecimal。但是,如果使用return
,它将查找返回对象的类型以确定该函数的返回类型。通常,您应该强烈避免return
在Scala代码中使用。返回函数主体中的最后一个评估值。使用a的唯一情况return
是当您想强制在函数主体中的其他位置返回值时。但是,更好的方法是将返回对象保存在变量中,然后仅在函数体的最后一行求值该变量。永远不要使用return!
没有return
它的作品
scala> val datatype = DecimalType(10, 2) datatype: org.apache.spark.sql.types.DecimalType = DecimalType(10,2) scala> val value = BigDecimal(10) value: scala.math.BigDecimal = 10 scala> datatype match {case DecimalType(_,_) => value} res150: scala.math.BigDecimal = 10
**退货问题**
scala> def test = {datatype match {case DecimalType(_,_) => return value}}:138: error: method test has return statement; needs result type def test = {datatype match {case DecimalType(_,_) => return value}} scala> def test:BigDecimal = {datatype match {case DecimalType(_,_) => return value}} test: BigDecimal scala> def test:DataType = {datatype match {case DecimalType(_,_) => return value}} :138: error: type mismatch; found : scala.math.BigDecimal required: org.apache.spark.sql.types.DataType def test:DataType = {datatype match {case DecimalType(_,_) => return value}} scala> def test3 = {datatype match {case DecimalType(_,_) => value}} test3: scala.math.BigDecimal
原来只有DecimalType模式与零参数匹配:
case DecimalType() => ...
如果需要精度和小数位数,则必须定义案例的类型并手动提取它们:
datatype match { case dt: DecimalType => val precision = dt.precision val scale = dt.scale ...