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

时间:2011-07-16 03:16:47

标签: scala

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

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

    var startDateTime = null;

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

    0.0
}

3 个答案:

答案 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 Optionnull here。过度总结,null是关于运行时检查,如果某个变量为空,则导致NullPointerExceptionOption是关于编译时检查,导致编译器错误指示潜在的必须处理非价值。使用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)
}