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和访问器。 如果你看到在trait中定义的val const,你会发现private val的创建被禁用,因为它只是def const访问器的一个定义。 我认为只有当他尝试创建访问器时才发生以前的定义(特征或超类)的推断类型,而不是用于评估值。 而对于最后的def const,类型只是基于private [this] val const类型:error =>错误 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读