我正在学习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?它会永远归还吗?
答案 0 :(得分:8)
@ dfeuer的回答是正确的,我只是想补充一些信息。
AnyVal
是基本类型的基本类型,即Int
,Boolean
,Byte
等。在Java中,这些是'关键字&#39 ;类型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
)之间找到常见类型,因此会找到{ {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"
应该可以做到这一点。