Scala添加if/else if后出现类型不匹配错误的解决咨询
问题修复方案
错误根源
你的方法声明返回String,但当前if/else if的每个分支最后执行的都是返回Unit类型的语句(比如show()、IOUtil.output()这类操作无返回值,本质返回Unit),而且没有覆盖所有分支场景(缺少else处理其他输入),导致编译器推断方法实际返回Unit,和声明的String类型不匹配。
修复思路(无需改成返回Any)
改成返回Any会丢失Scala的类型安全特性,不推荐。有两种更合理的修复方式:
方式1:方法不需要返回值,修改返回类型为Unit
这是最贴合你当前代码逻辑的方案,因为现有代码里没有需要返回String的场景:
private def method(): Unit = { val spark2 = spark import spark2.implicits._ if ("test1".equalsIgnoreCase(adTypeInput)) { var table = ( spark.read.parquet("path") // ... 省略中间操作 .distinct() ) table.select("propensity").summary().show(truncate = false) IOUtil.output(f"generate raw table with size: ${table.count()}") writeLocalTable(table) } else if("test2".equalsIgnoreCase(adTypeInput)) { val table = spark.read.parquet("path") // ... 省略中间操作 table.select("propensity").summary().show(truncate = false) IOUtil.output(f"generate raw table with size: ${table.count()}") } else { // 新增else分支处理其他输入,避免无返回值问题 IOUtil.output("不支持的adTypeInput类型") } }
方式2:方法确实需要返回String,每个分支末尾返回字符串
如果业务逻辑要求方法返回String,需在每个分支的最后一行返回一个String类型的值:
private def method(): String = { val spark2 = spark import spark2.implicits._ if ("test1".equalsIgnoreCase(adTypeInput)) { var table = ( spark.read.parquet("path") // ... 省略中间操作 .distinct() ) table.select("propensity").summary().show(truncate = false) val resultMsg = f"generate raw table with size: ${table.count()}" IOUtil.output(resultMsg) writeLocalTable(table) resultMsg // 分支最后返回String } else if("test2".equalsIgnoreCase(adTypeInput)) { val table = spark.read.parquet("path") // ... 省略中间操作 table.select("propensity").summary().show(truncate = false) val resultMsg = f"generate raw table with size: ${table.count()}" IOUtil.output(resultMsg) resultMsg // 分支最后返回String } else { val resultMsg = "不支持的adTypeInput类型" IOUtil.output(resultMsg) resultMsg // 分支最后返回String } }
内容的提问来源于stack exchange,提问作者reactnative
相关产品推荐
相关产品推荐

