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

Scala中“def”和“val”的不同类型推断

发布时间:2020-12-16 09:37:04 所属栏目:安全 来源:网络整理
导读:在应用于def和val时,我观察到Scala类型推理的差异。 使用def,我可以定义一个抽象的nullary方法const返回一些Int =类型的值诠释。当实现具有函数文字的const时,我不需要提供参数类型,因为它可以由编译器推断: trait D { def const: Int = Int}object D e
在应用于def和val时,我观察到Scala类型推理的差异。

使用def,我可以定义一个抽象的nullary方法const返回一些Int =>类型的值诠释。当实现具有函数文字的const时,我不需要提供参数类型,因为它可以由编译器推断:

trait D {
  def const: Int => Int
}
object D extends D {
  def const = i => i + 1
}

这可以。 (在缺点上,正在为每次访问D.const创建一个新的函数实例。)

现在考虑使用val的类似结构:

trait V {
  val const: Int => Int
}
object V extends V {
  val const = i => i + 1
}

这不会编译,失败

error: missing parameter type
   val const = i => i + 1
               ^

为什么?

解决方法

如果您使用-Xprint all选项构建此代码,您将看到:

abstract trait V extends scala.AnyRef {   
<stable> <accessor> def const: Int => Int
};

final object V extends java.lang.Object with V with ScalaObject {

def this(): object V = {
  V.super.this();
  ()
};

private[this] val const: <error> => <error> = ((i: <error>) => i.+(1));
<stable> <accessor> def const: <error> => <error> = V.this.const
}

所以错误发生在创建私有val和访问器。
编译器尝试在创建访问器def const之前评估对val const影响的值。

如果你看到在trait中定义的val const,你会发现private val的创建被禁用,因为它只是def const访问器的一个定义。

我认为只有当他尝试创建访问器时才发生以前的定义(特征或超类)的推断类型,而不是用于评估值。

而对于最后的def const,类型只是基于private [this] val const类型:error =>错误

(编辑:李大同)

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

    推荐文章
      热点阅读