在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是超类型吗?