Когда scala когда-нибудь вернет Any?

Я проходил курс scala от Coursera, который преподавал Мартин Одерски. Он привел несколько блестящих примеров о типах возврата, и одна вещь меня озадачила:

if(true) 1 else false // return AnyVal as this is the closest subtype of both primitive types

Я предполагаю, что следующее:

if(true) Tweet.comment("hello") else String("Hello") // I assume that this code will return AnyRef

Однако когда scala вернет Any? Вернется ли он когда-нибудь?


person Bula    schedule 18.05.2014    source источник
comment
if (cond) 1 else "hello". Существует два подтипа AnyAnyVal и AnyRef, поэтому, если две ветви возвращают подтип каждого из них, типом всего выражения будет Any.   -  person Lee    schedule 18.05.2014
comment
@ Ли, это должен быть ответ   -  person Ryan    schedule 18.05.2014


Ответы (3)


Я не знаю Scala, но на основе ваших примеров,

if(true) 1 else "hello"

вероятно, должен сделать трюк.

person dfeuer    schedule 18.05.2014
comment
ИМХО, ответы, которые не компилируются, не должны получать зеленую галочку. - person som-snytt; 19.05.2014

Ответ @dfeuer правильный, я просто хотел добавить дополнительную информацию.

AnyVal — это базовый тип для примитивных типов, т. е. Int, Boolean, Byte и т. д. В Java это типы «ключевого слова» int, boolean, byte.

AnyRef — это базовый тип для ссылочных типов, то есть java.lang.Object и почти любой class.

Any — общий тип между AnyVal и AnyRef. В вашем примере вы возвращаете 1 else false, поэтому компилятор ищет общий тип между Int и Boolean, находя AnyVal.

Если вы возвращаете if(true) 1 else "hello", он находит общий тип между Int (AnyVal) и String (AnyRef), поэтому он находит Any.

person Dylan    schedule 18.05.2014
comment
AnyRef includes just about any class это не AnyVal. Учитывая class X(val x: Int) extends AnyVal, тогда if (true) new X(42) else 42 имеет тип AnyVal. - person som-snytt; 19.05.2014
comment
Какую функцию выполняет класс AnyVal? Я предполагаю, что есть много вещей, которые можно сделать с помощью AnyRef (общие контейнеры и т. д.), но необработанные/неупакованные значения очень неоднородны. Существует ли AnyVal только для того, чтобы вы могли объявить класс как класс значений и заставить компилятор проверить для вас, что это действительно так? - person dfeuer; 19.05.2014
comment
Я не могу ответить на это с какой-либо реальной властью, но этот вопрос кажется связанным - person Dylan; 19.05.2014

Как насчет:

scala> if (true) "hi"
res0: Any = hi

Это связано с тем, что в спецификации указано что предложение else снабжено значением Unit, которое равно AnyVal:

scala> if (true) "hi" else ()
res1: Any = hi

Это появилось на ТАК некоторое время назад, но я не мотивирован выслеживать его. Урок, однако, заключается в том, что можно было бы наивно ожидать, что одинокий if будет иметь тип Unit.

У меня только что была ошибка компилятора для рекурсивной функции вида:

def f = if (cond) f

Вы должны указать тип результата f.

person som-snytt    schedule 18.05.2014