在返回类型上重载?

5 浏览
0 Comments

在返回类型上重载?

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日
0
0 Comments

这个情况不是发生在这个案例中,但实际上,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
}

0
0 Comments

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中最好地描述了。

0