很抱歉问了这个愚蠢的问题。我是Scala新手,不知道Scala是如何工作的。没有if /else if条件的代码工作得很好。但是当我添加if /else if条件时,它抱怨道:
ScoreTable.scala:172:10: type mismatch;
[error] found : Unit
[error] required: String
[error] else if ("test2".equalsIgnoreCase(adTypeInput)) {
[error] ^
我应该如何修复它?Adjust private def method():私有def方法()的字符串:有吗?
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)
IOUtil.output(f"generate raw table with size: ${table.count()}")
writeLocalTable(table)
} else if("test2".equalsIgnoreCase(adTypeInput)) {
spark.read.parquet("path")
...
...
table.select("propensity").summary().show(truncate = false)
IOUtil.output(f"generate raw table with size: ${table.count()}")
}
1条答案
按热度按时间wwtsj6pe1#
Scala是面向表达式的。
Scala
if(...) ... else ...
不像Javaif(...) {...} else {...}
,它更像是Java三元运算符... ? ... : ...
,你可以把它的值赋给某个变量:在Scala中,每个块返回最后一个表达式。
所以在
第一街区
型
返回
writeLocalTable(table)
的值。我怀疑它是Unit
?第二块
返回
IOUtil.output(...)
的值。我怀疑它也是Unit
?if-else
的所有分支必须返回相同类型A
的值,则整个if-else
表达式返回类型A
的值。所以现在是
Unit
,但是在def method(): String = ...
中你保证方法返回String
,这是一个类型不匹配,也就是编译错误:found: Unit, required: String
.更改方法的签名:
def method(): Unit = ...
(但也有可能您必须更改调用method
的位置,即仍然需要String
的位置)或从每个分支返回一个String
,如签名中所承诺的那样或者让
if-else
返回Unit
,但从方法返回String
您应该查看在使用
if-else
进行更改之前返回了什么String
。