В этом нет ничего специфичного для Scala. Это просто вопрос того, что целевой тип присваивания не имеет отношения к типу, в котором выполняется операция (в данном случае умножение).
Например, в C #:
using System;
class Program
{
static void Main(string[] args)
{
int a = unchecked(86400000 * 150);
long b = unchecked(86400000 * 150);
long c = 86400000 * (long) 150;
long d = 86400000 * 150L;
Console.WriteLine(a); // 75098112
Console.WriteLine(b); // 75098112
Console.WriteLine(c); // 12960000000
Console.WriteLine(d); // 12960000000
}
}
Часть unchecked
здесь заключается в том, что компилятор C # достаточно умен, чтобы понять, что операция переполнена, но только потому, что оба операнда являются константами. Если бы любой операнд был переменной, все было бы хорошо без unchecked
.
Аналогично в Java:
public class Program
{
public static void main(String[] args)
{
int a = 86400000 * 150;
long b = 86400000 * 150;
long c = 86400000 * (long) 150;
long d = 86400000 * 150L;
System.out.println(a); // 75098112
System.out.println(b); // 75098112
System.out.println(c); // 12960000000
System.out.println(d); // 12960000000
}
}