在返回类型上重载?
在返回类型上重载?
scala> val shares = Map("Apple" -> 23, "MicroSoft" -> 50, "IBM" -> 17) shares: scala.collection.immutable.Map[java.lang.String,Int] = Map(Apple -> 23, MicroSoft -> 50, IBM -> 17) scala> val shareholders = shares map {_._1} shareholders: scala.collection.immutable.Iterable[java.lang.String] = List(Apple, MicroSoft, IBM) scala> val newShares = shares map {case(k, v) => (k, 1.5 * v)} newShares: scala.collection.immutable.Map[java.lang.String,Double] = Map(Apple -> 34.5, MicroSoft -> 75.0, IBM -> 25.5)
从这个示例中,似乎map
方法对返回类型进行了重载。但是返回类型的重载不可能吧?有人可以解释一下这里发生了什么吗?
admin 更改状态以发布 2023年5月24日
这个情况不是发生在这个案例中,但实际上,JVM支持返回值重载。在Scala中,对于具有擦除到相同类型的不同泛型参数类型的方法,它是可见的。链接中给出的示例是
object Overload{ def foo(xs : String*) = "foo"; // after erasure is foo:(Seq)String def foo(xs : Int*) = 3; // after erasure is foo:(Seq)Int }
map
没有针对返回类型进行重载。相反,有一个具有抽象返回类型的方法。
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
在字节码中,这被擦除为Object
:
public abstract java.lang.Object map(scala.Function1, scala.collection.generic.CanBuildFrom);
这种模式在论文Fighting Bit Rot with Types中最好地描述了。