我已经删除了该方法,因此它没有逻辑意义,但我只是想解决编译错误
def getVWAP(date: Date, maxEvents: Int): Double = {
var startDateTime = null;
if (maxEvents > 0) {
startDateTime = date; // error
}
0.0
}
答案 0 :(得分:10)
Scala使用type inference来推断变量startDateTime
的类型,您没有为其指定类型。因此,Scala会发出以下错误:
error: type mismatch;
found : Date
required: Null
startDateTime = date; // error
这就是说,它认为startDateTime
应该是Null类型,但是你给它一个Date
。
修复方法是明确键入startDateTime
,如下所示:
var startDateTime : Date = /* some sort of default date */
如果您的startDateTime
是真正可选的,请考虑使用Scala Option而不是null
。这会使你的函数看起来像这样:
def getVWAP(date: Date, maxEvents: Int): Double = {
var startDateTime: Option[Date] = None;
if (maxEvents > 0) {
startDateTime = Some(date);
}
0.0
}
您可以详细了解the philosophy of Option
与null
here。过度总结,null
是关于运行时检查,如果某个变量为空,则导致NullPointerException
,Option
是关于编译时检查,导致编译器错误指示潜在的必须处理非价值。使用Option
表示你更愿意在编译时知道。
答案 1 :(得分:3)
因为startDateTime
声明的类型为Null
。无法为其指定日期。在声明中声明startDateTime
的类型。
答案 2 :(得分:3)
可能是因为startDateTime
的类型未被推断为Date
。尝试用
var startDateTime:Date = //(some initialized Date value)
您会发现Scala和Java之间的一个重大区别是避免使用null
。如果您真的想要一个可能未设置的变量,您应该查看Options
在这种情况下,您可以将startDateTime定义为
var startDateTime:Option[Date] = None
if(maxEvents > 0){
startDateTime = Some(date)
}