【问题标题】:Scala class constructor's default argument namingScala类构造函数的默认参数命名
【发布时间】:2016-09-23 09:24:14
【问题描述】:

我需要使用反射来实例化 Scala 类。

我想使用具有默认值参数的类默认构造函数,所以我需要获取这些默认值。

Scala 中的默认值只是 JVM 中的方法,因此我需要获取所有类方法并仅调用那些返回默认值的方法。

问题:我看到返回默认 arg 值的方法有两种不同的命名约定 - “apply$default$X”和“$lessinit$greater$default$X ”(其中 X 是特定参数的位置数)。 这两者有什么区别? 也许这取决于 Scala 版本或其他什么?

【问题讨论】:

    标签: scala reflection


    【解决方案1】:

    如果你声明一个案例类

    case class Foo(bar: Int)
    

    然后这会创建一个普通类和一个伴生对象:

    class Foo(bar: Int) { // def toString, hashCode, equals 
    }
    object Foo {
      def apply(bar: Int) = new Foo(bar)
      // def unapply
    }
    

    当然,如果你有默认参数值,那么构造函数和apply方法都必须使用这些默认值;任何其他行为都会非常令人惊讶。

    所以构造函数的默认值是由$lessinit$greater$default$X方法返回的(因为构造函数的名字是<init>)。 apply$default$Xapply 方法的默认值。

    对于非案例类,您应该只看到$lessinit$greater$default$X,除非您自己定义了apply 方法。

    【讨论】:

    • 但还有一个问题:为什么 apply() 和 有两种不同的默认值方法?如果我声明 class Foo(bar: Int = 0) ,那么伴随对象也应该使用这个特定的值,并且两个方法只是一个样板。
    • 我认为这只是为了避免使这种情况成为特殊情况。插入默认值方法调用时,编译器目前只需要知道方法名和签名即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2017-11-10
    • 2013-03-16
    • 2014-07-09
    • 1970-01-01
    • 2013-01-19
    相关资源
    最近更新 更多