【问题标题】:When will scala ever return Any?scala 什么时候会返回 Any?
【发布时间】:2014-07-06 16:22:14
【问题描述】:

我正在学习 Coursera 教授 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?它会返回 Any 吗?

【问题讨论】:

  • if (cond) 1 else "hello"Any 有两个子类型 - AnyValAnyRef,因此如果这两个分支分别返回一个子类型,则整个表达式的类型将是 Any
  • @Lee 这应该是一个答案

标签: scala inheritance hierarchy subtype


【解决方案1】:

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

if(true) 1 else "hello"

应该可以解决问题。

【讨论】:

  • 恕我直言,未编译的答案不应获得绿色检查。
【解决方案2】:

怎么样:

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

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

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

不久前就出现了,但我没有动力去追捕它。然而,教训是,人们可能会天真地认为单独的 if 是 Unit 类型。

我刚刚遇到以下形式的递归函数的编译器错误:

def f = if (cond) f

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

【讨论】:

    【解决方案3】:

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

    AnyVal 是基本类型的基本类型,即IntBooleanByte 等。在Java 中,这些是“关键字”类型intbooleanbyte .

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

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

    如果你返回if(true) 1 else "hello",它会找到Int(一个AnyVal)和String(一个AnyRef)之间的公共类型,所以它会找到Any

    【讨论】:

    • AnyRef includes just about any class 不是AnyVal。给定class X(val x: Int) extends AnyVal,那么if (true) new X(42) else 42 的类型为AnyVal
    • AnyVal 类有什么作用?我想AnyRef(通用容器等)可以做很多事情,但是原始/未装箱的值非常不统一。 AnyVal 是否存在只是为了让您可以将一个类声明为一个值类并让编译器为您验证它是否真的是一个?
    • 我无法以任何真正的权威回答这个问题,但this question 似乎相关
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多