Scala:在某个包的所有子包中导入隐式转换
我在对象中定义了隐式转换.让我们调用对象Implicits,其中有一个隐式转换.
package com.gmail.naetmul.stackoverflow.app object Implicits { implicit def int_to_intEx(x: Int): IntEx = IntEx(x) } 这个对象在某个包中.我想在com.gmail.naetmul.stackoverflow.app包及其所有子包中的每个代码中使用这种隐式转换,例如com.gmail.naetmul.stackoverflow.app.something.anything.everything. 所以我创建了com.gmail.naetmul.stackoverflow.app的包对象. package com.gmail.naetmul.stackoverflow package object app { import com.gmail.naetmul.stackoverflow.app.Implicits._ } 但它不能在确切的包对象之外工作. package com.gmail.naetmul.stackoverflow.app trait Implicits { implicit def int_to_intEx(x: Int): IntEx = IntEx(x) } package com.gmail.naetmul.stackoverflow import com.gmail.naetmul.stackoverflow.app.Implicits package object app extends Implicits { // some code } 隐式转换在com.gmail.naetmul.stackoverflow.app包中有效.但是,它在子包中工作或不工作. 例如) 文件A.scala package com.gmail.naetmul.stackoverflow.app.database class A { // Here,the implicit conversion did NOT work. } 文件B.scala package com.gmail.naetmul.stackoverflow.app package database class B { // Here,the implicit conversion DID work. } 所以问题是: >在这种情况下,我应该使用trait而不是object(使用包对象,但在外面定义)? 解决方法
对于问题1,将超类中的含义隐藏为“LowPriorityImplicits”会很有用,但这似乎不是这里的用例.
对于问题2,嵌套包是将implicits纳入范围的常用方法. “packagings”中的规范9.2使用了一个神奇的短语,“在他们的简单名称下可见”. 但是有一些利用隐式范围的策略. 我想从你的部分例子中猜测你想用像奇数这样的方法来增强Int.对于此用例,提供缺少的成员,您必须提供已完成的转换. 但API设计还有其他选择.例如: 给定API: package goofy object API { def api(i: IntEx) = i.odd } 以及子包中API的客户端: package goofy.foo.bar.baz import org.junit.Test class UseIntExTest { import goofy.API._ @Test def usage(): Unit = { assert(api(3)) } } 在哪里导入API并获得“免费”的隐式范围. 转换位于伴随对象中: package goofy class IntEx(val i: Int) { def even = i % 2 == 0 def odd = !even } object IntEx { implicit private[goofy] def `enhanced IntEx`(i: Int): IntEx = new IntEx(i) } 这是有效的,因为IntEx是一种预期的类型.您也可以以相同的方式利用类型参数. 为了完整性,要显示转换受限于子包: package roofy import org.junit.Test class BadUsageTest { import goofy.API._ @Test def usage(): Unit = { //assert(api(3)) // DNC } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |