在 Scala 中,我可以通过隐式转换引用私有类型



我在nscala_time包(joda-time的scala版本)中发现了这种有趣的行为

import com.github.nscala_time.time.Imports._
import com.github.nscala_time.time.DurationBuilder
object tests {
  val x = 3 seconds
  //> x : is of type com.github.nscala_time.time.DurationBuilder
  val xx: DurationBuilder = 3 seconds
  //> fails to compile: 
  // class DurationBuilder in package time cannot be accessed in package com.github.nscala_time.time
}

我试图实现的是从 nscala_time 持续时间到 scala.concurrent.持续时间的隐式转换我需要这个,因为我在一个应用程序中使用 RxScala 和 nscala_time。

// e.g. the following should be implicitly converted
// to nscala_time Duration first
// than to scala.lang.concurrent.Duration
3 seconds

nscala_time为我的应用程序提供了丰富的时间和日期 API,而我在同一类中使用 RxScala 来实现 GUI 响应性。您可以下载一个简单的项目来玩:https://dl.dropboxusercontent.com/u/9958045/implicit_vs_private.zip

来自 scala 用户组:这是一个已知问题 https://issues.scala-lang.org/browse/SI-1800

也许您可以使用隐式转换?(顺便说一句,恩斯卡拉的Duration基本上是org.joda.time.Duration):

scala> import com.github.nscala_time.time.Imports._
import com.github.nscala_time.time.Imports._
scala> implicit class DurationHelper(d:org.joda.time.Duration) {
     | def toScalaDuration = scala.concurrent.duration.Duration.apply(d.getMillis,scala.concurrent.duration.MILLISECONDS)
     | }
defined class DurationHelper
scala> val d = RichInt(3).seconds.toDuration
// toDuration method is defined for com.github.nscala_time.time.DurationBuilder
d: org.joda.time.Duration = PT3S
scala> def exfun(d:scala.concurrent.duration.Duration) = d.toString
exfun: (d: scala.concurrent.duration.Duration)String
scala> exfun(d)
res41: String = 3000 milliseconds

(这里不使用import scala.concurrent.duration._以避免与 Joda/NLSCALA 的东西发生名称冲突)

最新更新