Почему я не могу назначить переменные в Scala следующим образом? - PullRequest
1 голос
/ 16 июля 2011

Я сократил метод, чтобы он не имел логического смысла, но я просто пытаюсь устранить ошибку компиляции

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

    var startDateTime = null;

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

    0.0
}

Ответы [ 3 ]

10 голосов
/ 16 июля 2011

Scala использовал вывод типа , чтобы определить тип переменной 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 вместо null. Это сделало бы вашу функцию похожей на это:

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

Подробнее о философии Option и null можно прочитать здесь . Подводя итог, можно сказать, что null относится к проверке во время выполнения, что приводит к NullPointerException, если какая-то переменная имеет значение null, а Option к проверке во время компиляции, что приводит к ошибке компилятора, указывающей на то, что потенциальное ненулевое значение должно быть обработано , Использование Option говорит, что вы предпочли бы знать во время компиляции.

3 голосов
/ 16 июля 2011

Это, вероятно, потому что они типа startDateTime не выводятся как Date. Попробуйте заменить эту строку на

var startDateTime:Date = //(some initialized Date value)

Одна большая разница между Scala и Java, которую вы обнаружите, заключается в избежании использования null. Если вы действительно хотите переменную, которая не может быть установлена, вы должны посмотреть Опции

В этом случае вы должны определить свой startDateTime как

var startDateTime:Option[Date] = None
if(maxEvents > 0){
  startDateTime = Some(date)
}
3 голосов
/ 16 июля 2011

Поскольку startDateTime объявлено с типом Null. Не могу назначить дату этому. Объявите тип для startDateTime в вашем объявлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...