scala.Any在Scala类层次结构中

时间:2014-07-19 19:46:26

标签: scala

在Scala中,许多类型都扩展为Any。 Click here表示Scala类层次结构图。

例如,Double和Tuple都扩展了Any,下面的代码按预期工作:

def foo(x: Any) { println(x.toString) }
foo(3.0) // prints: 3.0
foo((2,3)) //prints: (2,3)

但是,我不明白为什么以下内容不起作用,因为它遵循上述所有逻辑:

def bar(fn: Any => String) { println(fn.toString) }

def dub(d: Double): String = "dub"
def tup(tup: (Int, Int)): String = "tup"

bar(dub) // ERROR
bar(tup) // ERROR

调用栏(dub)和栏(tup)都会导致类型不匹配错误。对于bar(dub),编译器说:

error: type mismatch;
found: Double => String
required: Any => String

有人可以向我解释为什么在第二种情况下存在类型不匹配,即使Any是超类型吗?

1 个答案:

答案 0 :(得分:7)

因为Double => String不是Any => String的子类型。

以这种方式思考:bar需要一个参数,该函数可以将任何转换为字符串。您正在为它提供一个可以将 double 转换为字符串的函数,但它无法将 else 转换为字符串。因此,它不是bar正在寻找的东西。

请注意,反之亦然:Double => String参数可以接受Any => String函数。

原因是Function1定义为Function1[-T1, +R],而-T1表示第一个类型参数是逆变(第二个是< EM>协变)。您可以阅读更多herehere