【问题标题】:Is there a way to control which implicit conversion will be the default used?有没有办法控制默认使用哪个隐式转换?
【发布时间】:2010-12-25 14:37:48
【问题描述】:

假设我有这个:

class String2(val x:String) {
    def *(times:Int) : String = {
        val builder = new StringBuilder()
        for( i <- 0 until times) {
            builder.append(x)
        }
        builder.toString()
    }
}

现在如果我添加这个隐式:

implicit def gimmeString2(y:String) = new String2(y)

我会得到一个编译错误,因为 stringWrapper 也添加了这个隐式。有没有办法对编译器说“忽略其他隐式,使用这个”,这样我就不必实例化 String2 对象并处理它?

我承认示例代码可能不是最合适的(对于这个问题),但我认为可以。

【问题讨论】:

  • 我不认为它是重复的。该问题的作者希望保留这两个隐含含义。我只想要一个。
  • RichString 中已有一种与上述方法非常相似(如果不相同)的方法。如果您希望使用您的方法,也许您可​​以使用 import a.b.{c => _} 技术来隐藏 c,其中 c 是隐式方法名称。

标签: scala implicit


【解决方案1】:

Scala 2.8 为隐式添加了优先级系统。这在SIP on the new Java arrays中有解释:

在比较重载方法或隐式方法的两种不同的适用替代方案时,每个方法都因具有更具体的参数而得一分,而在适当的子类中定义的另一种方法则得一分。如果在这两次比较中获得更多分数,则替代方案会“胜过”另一个方案

得出结论 如果备选方案具有相同的参数类型,则在子类中定义 胜利。因此,我相信您可以如下声明隐含:

trait LowPriorityImplicits {
  //lower priority conversions
}

object HighPriorityImplicits extends LowPriorityImplicits {
  //higher-order ones here
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 2015-08-08
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2020-09-22
    • 2020-01-31
    相关资源
    最近更新 更多