加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 使用参数默认值键入erasure

发布时间:2020-12-16 18:16:13 所属栏目:安全 来源:网络整理
导读:以下内容无法编译: package playobject Stats2 { def variance(data: Seq[Double],dof: Int = 0): Double = { println("variance Double direct"); 1.0 } def variance[T](data:Seq[T],dof: Int = 0)(implicit ex: T = Double): Double = { println("varian
以下内容无法编译:

package play

object Stats2 {
  def variance(data: Seq[Double],dof: Int = 0): Double = {
    println("variance Double direct"); 1.0
  }
  def variance[T](data:Seq[T],dof: Int = 0)(implicit ex: T => Double): Double = {
    println("variance Double extracted"); 1.0
  }
}

编译器说:

$scalac erasure2.scala 
erasure2.scala:7: error: double definition:
method variance$default$2:[T]=> Int and
method variance$default$2:=> Int at line 4
have same type after erasure: ()Int
  def variance[T](data:Seq[T],dof: Int = 0)(implicit ex: T => Double): Double = {
                               ^
one error found

如果dof:Int = 0更改为dof:Int,则示例将按预期编译并运行.

无论代码是否有效,默认参数值的存在与否都会发生变化,这似乎很难看.

为什么这才真正有意义的解释是什么?

解决方法

问题是,当你使用默认参数时,它的名称和方法名称用于生成静态属性,这样:[methodName] $default $[argumentPosition],在你的情况下它将是variance $default $2,所以如果两者都有默认参数,编译器将尝试生成具有相同名称的2个静态属性.

如果使用方法中其他参数的类型,则可以避免这种情况.您可以submit a SIP建议在编译器中更改此行为.

您可以在此post上阅读更多相关信息

如果你想自己检查,尝试用每个方法编译你的对象,并使用javap [XXX]检查类,在你的javap Stats2的情况下,对象或类的名称.
你的第一种方法将给出:

public final class Stats2 extends java.lang.Object{
    public static final int variance$default$2();
    public static final double variance(scala.collection.Seq,int);
}

而你的第二种方法将给出:

public final class Stats2 extends java.lang.Object{
    public static final int variance$default$2();
    public static final double variance(scala.collection.Seq,int,scala.Function1);
}

最后,通过在第二种方法中删除dof的默认值,我们得到:

public final class Stats2 extends java.lang.Object{
    public static final double variance(scala.collection.Seq,scala.Function1);
}

因此静态最终的int方差$default $2()是使编译失败的原因,它是由默认值生成的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读