Разница между соответствием String и Int в Scala - PullRequest
2 голосов
/ 28 февраля 2011

Рассмотрим следующие два фрагмента кода:

scala> def f1(x:Any) = x match { case i:String => i; case _ => null }
f1: (x: Any)String

scala> def f2(x:Any) = x match { case i:Int => i; case _ => null }
f2: (x: Any)Any

Почему f2 возвращает тип Any, а f1 - String? Я ожидал, что оба вернутся Any или f2 вернутся Int.

1 Ответ

12 голосов
/ 28 февраля 2011

Вывод типа выбирает наименьший общий супертип, если метод возвращает разные типы.

Ваша функция f1 возвращает String или null, общим супертипом которого является String, поскольку String может иметь значение null. Строка является подклассом AnyRef, а AnyRef s может иметь значения null.

Ваша функция f2 возвращает Int (подкласс AnyVal) или null, общим супертипом которого является Any. Int не может быть null.

См. http://docs.scala -lang.org / tutorials / tour / unified-types.html для иерархии классов Scala.

Другой пример:

scala> def f3(b: Boolean) = if (b) 42
f: (b: Boolean)AnyVal

f3 возвращает

42 - b true

или (), если b равно false.

Итак, типы, которые он возвращает: Int и Unit. Общий супертип - AnyVal.

...