小编joh*_*van的帖子

我可以模仿Scala SIP-18-syle进口吗?

Scala SIP 18提供了一种强制用户提供import语句以使用某些高级或不安全语言功能的方法.例如,为了使用更高级的类型,您需要

import scala.language.higherKinds
Run Code Online (Sandbox Code Playgroud)

或者您将收到一个编译器警告,告诉您正在使用高级功能.

有什么方法可以在我自己的库中重现或模仿这种行为吗?例如,我可能有:

trait MongoRepository[E <: Entity] {
  val casbahCollection: com.mongodb.casbah.MongoCollection
}
Run Code Online (Sandbox Code Playgroud)

我让casbahCollection公众在他们需要的时候向用户公开底层集合.但它真的不是我希望我的用户做的事情,因为它是一个漏洞的抽象.所以我想强迫他们做这样的事情:

import my.library.mongo.leakyAbstraction
Run Code Online (Sandbox Code Playgroud)

在做这样的事情之前:

widgetRepo.casbahCollection.find()
Run Code Online (Sandbox Code Playgroud)

可能吗?有没有什么方法可以提供类似的行为,比在文档中放置一个大的丑陋警告更有效?

scala

4
推荐指数
1
解决办法
61
查看次数

传递一个带有类型参数的函数作为参数

我想创建一个函数g,它将函数f作为参数,其中f有一个类型参数.我无法获得g该编辑的签名.一次尝试是这样的:

scala> def mock1[A](): A = null.asInstanceOf[A] // STUB
mock1: [A]()A

scala> def mock2[A](): A = null.asInstanceOf[A] // STUB
mock2: [A]()A

scala> def g0(f: [A]() => A): Int = f[Int]()
<console>:1: error: identifier expected but '[' found.
       def g0(f: [A]() => A): Int = f[Int]()
                 ^
Run Code Online (Sandbox Code Playgroud)

如果我将包含类型参数的函数包装在特征中,我可以使它工作,如下所示:

scala> trait FWrapper { def f[A](): A }
defined trait FWrapper

scala> class mock1wrapper extends FWrapper { def f[A]() = mock1[A]() }
defined class mock1wrapper …
Run Code Online (Sandbox Code Playgroud)

scala type-parameter

2
推荐指数
1
解决办法
2224
查看次数

标签 统计

scala ×2

type-parameter ×1