什么时候scala会回归Any?

时间:2014-05-18 18:21:10

标签: scala inheritance hierarchy subtype

我正在学习Martin Odersky的课程中的scala课程。他给出了一些关于回归类型的精彩例子,有一件事困惑我:

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?它会永远归还吗?

3 个答案:

答案 0 :(得分:8)

@ dfeuer的回答是正确的,我只是想补充一些信息。

AnyVal是基本类型的基本类型,即IntBooleanByte等。在Java中,这些是'关键字&#39 ;类型intbooleanbyte

AnyRef是引用类型的基本类型,即java.lang.Object和几乎任何class

AnyAnyValAnyRef之间的常见类型。在您的示例中,您返回1 else false,因此编译器会在IntBoolean之间查找公共类型,找到AnyVal

如果您返回if(true) 1 else "hello",则会在IntAnyVal)和StringAnyRef)之间找到常见类型,因此会找到{ {1}}。

答案 1 :(得分:4)

怎么样:

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

那是因为the spec says为else子句提供了Unit值,这是一个AnyVal

scala> if (true) "hi" else ()
res1: Any = hi
很久以前就出现了,但是我并没有动力去追捕它。但是,教训是,人们可能天真地期望单独的if成为单位。

我刚刚为表单的递归函数编译错误:

def f = if (cond) f

您必须指定f的结果类型。

答案 2 :(得分:1)

我不了解Scala,但根据您的示例,

if(true) 1 else "hello"

应该可以做到这一点。