为什么我不能以下列方式在Scala中分配变量?

del*_*ber 1 scala

我已经删除了该方法,因此它没有逻辑意义,但我只是试图解决编译错误

def getVWAP(date: Date, maxEvents: Int): Double = {

    var startDateTime = null;

    if (maxEvents > 0) {
        startDateTime = date; // error
    }

    0.0
}
Run Code Online (Sandbox Code Playgroud)

Emi*_*Sit 10

Scala使用类型推断来推断变量的类型startDateTime,您没有为其指定类型.因此,Scala发出以下错误:

error: type mismatch;
 found   : Date
 required: Null
           startDateTime = date; // error
Run Code Online (Sandbox Code Playgroud)

这说,它认为startDateTime应该是Null类型,但是你给它一个Date.

修复方法是显式键入startDateTime如下:

var startDateTime : Date = /* some sort of default date */
Run Code Online (Sandbox Code Playgroud)

如果您startDateTime的确是可选的,请考虑使用Scala的选项而不是使用null.这会使你的函数看起来像这样:

def getVWAP(date: Date, maxEvents: Int): Double = {
    var startDateTime: Option[Date] = None;
    if (maxEvents > 0) {
        startDateTime = Some(date);
    }
    0.0
}
Run Code Online (Sandbox Code Playgroud)

你可以阅读更多关于哲学Optionnull 这里.过度概括,null是有关运行时检查,导致NullPointerException如果一些变量是空的,Option大约是编译时检查,导致编译器错误指示可能非价值必须被处理.使用Option说你宁愿在编译时知道.